zoukankan      html  css  js  c++  java
  • Java多线程基础概念

    进程跟线程的区别

    • 进程process是操作系统中运行的一个任务,占有一定的内存资源;线程thread是进程中包含的一个或多个执行单元,归属于进程

    多线程的应用场景

    • 一个程序需要同时完成多个任务时
    • 多个线程效率更高的情况下,比如下载

    并发原理

    • 对于单核cpu来说,多线程并不是同时进行的,操作系统将时间分成了多个时间片,大概均匀的分配给线程,到达某个线程的时间段,该线程运行,其余时间待命,这样从微观上看,一个线程是走走停停的,宏观感官上,在某一时刻似乎所有线程都在运行。并发是针对时间片段来说的,在某个时间段内多个线程处于runnable到running之间,但每个时刻只有一个线程在running,这叫做并发。

    创建线程

    • 继承Thread类,重写run方法
    • 定义线程体Runnable run1,实现Runnable接口,Thread t = new Thread(run1);
    • 继承Thread创建线程相对于实现Runnable接口来创建,有两点坏处,一是将线程与任务形成了强耦合关系,破坏了线程的复用性,二是java中的类只能继承一个父类,继承Thread阻断了其它的继承关系,而一个类可以实现多个接口,很灵活
    • thread的start方法,用于将线程纳入到线程调度 ,线程进入runnable状态
    • 可以使用匿名内部类的方式创建线程

    java中线程的几个常用api

    • Thread.currentThread(); //获取当前线程,返回Thread
    • Thread.getId(); //获取线程id,返回long
    • Thread.getName(); //获取线程名字,返回String
    • Thread.getPriority(); //获取线程优先级,返回int,提供了三个常量(MIN_PRIORITY、MAX_PRIORITY、NORM_PRIORITY)
    • Thread.getState(); //获取线程状态
    • Thread.isAlive(); //获取线程是否活动
    • Thread.isDaemon(); //返回是否是守护线程
    • Thread.isInterrupted(); //返回是否中断
    • static Thread.interrupted();//返回是否中断,并重置中断状态为false
    • Thread.sleep(ms); //使线程进入休眠,sleepblock,休眠结束回到Runnable
    • static Thread.yield(); //static方法,让出时间片并回到Runnable
    • Thread.join(); //比如在线程b的方法中加入a.join,代表等待线程a执行完毕,再执行b

    守护线程

    • setDaemon(boolean b); //需要在start方法调用前进行设置
    • 当线程只剩下守护线程时,所有守护线程终止
    • 比如GC

    synchronized

    • 多个线程并发读写同一个临界资源,会引发线程并发安全问题
      ** 临界资源:多线程共享实例变量;多线程共享静态资源变量
      ** 解决办法:异步变同步
    • 同步与异步
      ** 有先后顺序的运行方式是同步
      ** 没有先后顺序,由线程调度随机分配时间片段运行,是异步
    • synchronized是java中的同步锁
    • synchronized可以修饰某个方法,使访问这个方法的线程同步
    • synchronized(object){代码块}; //object必须是同一对象,锁才有效用
      ** 如果synchronized在一个非静态方法中,通常锁对象是this
      ** synchronized也可以直接修饰代码块

    wait&notify

    • 多线程之间协调工作
    • 条件不满足,等待wait,条件满足notify,等待唤醒
    • 如果想在一个线程上等待,在另一个线程上notify,那么需要给这两个方法加锁
      ** synchronized(obj){obj.wait();}
      ** synchronized(obj){obj.notify();}
    • 如果多个线程在一个线程上等待,notify()只能唤醒一个,notifyAll()可以唤醒所有

    线程安全API与非线程安全API

    • StringBuffer 同步的,线程安全,synchronized append()]
    • StringBuilder 不同步的,线程不安全的,append()
    • Vector Hashtable ConcurrentHashMap同步,线程安全
    • ArrayList HashMap 不同步,线程不安全
    • Collections.synchronizedList(list) 获取线程安全的list集合
    • Collections.synchronizedSet(set) 获取线程安全的set集合
    • Collections.synchronizedMap(map) 获取线程安全的map

    线程池

    • 重用与限制数量
    • 线程池的使用与ExecutorService实现:另开一章
  • 相关阅读:
    [SDOI2016]排列计数
    Broken robot
    环路运输
    naptime
    Accumulation Degree
    选课
    没有上司的舞会
    金字塔
    Polygon
    石子合并
  • 原文地址:https://www.cnblogs.com/simple-huang/p/8605905.html
Copyright © 2011-2022 走看看