首页 > 代码库 > 多线程总结

多线程总结

版权声明:以前的Blog文章合并。原创作品,谢绝转载!否则将追究法律责任。

1.重写线程Thread,Runnable运行的是run方法,当调用线程start()时,会运行其run方法,

也可以主动去调用,只不过不在同一个线程里。

当一个线程既继承了Thread又继承Runnable,其thread必须调用target.run()实现对runnable的方法调用。


2.Object:的三种线程方法 wait() ,notify() ,notifyAll()

在某个线程里执行某个对象锁的wait方法会暂停该线程的运行,在另外一条线程里利用该锁的notify方法

可以唤醒某个该对象锁所在的线程;当该对象锁在多个线程里wait的时候,可以使用notifyAll唤醒运行。


3.线程调度-休眠/优先级/让步/合并/守护线程

休眠。静态方法Thread.sleep();谁调用谁休眠

对于优先级高的线程获取CPU机率比较大,并不一定优先级低的运行不了

线程的让步含义就是使当前运行着线程让出CPU资源,但是然给谁不知道,仅仅是让出,线程状态回到可运行状态。Thread.yield()

线程的合并的含义就是将几个并行线程的线程合并为一个单线程执行,应用场景是当一个线程必须等待另一个线程执行完毕才能执行时可以使用join方法。

调用某个线程的join(),该线程运行完才运行调用它的线程代码。

守护线程的特征是当setDaemon(boolean on)将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。

该方法必须在启动线程前调用。实际上:JRE判断程序是否执行结束的标准是所有的前台执线程行完毕了,而不管后台线程的状态


4.线程的同步-同步方法/同步块

在多个线程运行的时候,是否有竞争资源同时改动。应该把竞争资源设为私有,并提供修改方法。可以是对修改方法的同步,也可以对代码块同步。

同步使用synchronized关键字。


5.线程池-JAVA5 API

固定线程池:

//创建一个可重用固定线程数的线程池 ExecutorService pool = Executors.newFixedThreadPool(2);

//创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。 ExecutorService pool = Executors.newSingleThreadExecutor();

//当要加入的池的线程(或者任务)超过池最大尺寸时候,则入此线程池需要排队等待。一旦池中有线程完毕,则排队等待的某个线程会入池执行。

可变尺寸的线程池:

//创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。 ExecutorService pool = Executors.newCachedThreadPool();

延迟连接池:

//创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。 ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);

//pool.execute(t3); //使用延迟执行风格的方法 pool.schedule(t4, 10, TimeUnit.MILLISECONDS);

//单任务延迟线程池:

//ScheduledExecutorService pool = Executors.newSingleThreadScheduledExecutor();


6.有返回值的线程-JAVA5 API

线程不再继承runnable借口,而是callable接口并重写call方法。通过线程池submit调用,

返回的Future对象,通过get()方法取得返回的对象。


7.线程锁:-JAVA5 API

Lock类代替synchronized,在需要同步的代码块里调用lock(),unlock().

-ReentrantLock

ReadWriteLock 用于I/0读写。

-ReentrantReadWriteLock


8.-JAVA5 API

//阻塞队列:java.util.concurrent.BlockingQueue继承了Queue接口,且是固定个数的队列,当队列满了,

需要继续添加,或者队列没有元素,需要取出时,队列阻塞。

//阻塞栈:对于阻塞栈,与阻塞队列相似。不同点在于栈是“后入先出”的结构。java.util.concurrent.BlockingDeque

是JAVA6 API中新提出的一个类。


9.线程调度-JAVA5 API

通过Lock对象的newCondition()得到Condition对象,并调用其await();signalAll();等。对应了Object中wait();

notifyAll();


10.原子量-JAVA5 API

java.util.concurrent.atomic的使用需要Lock的配合。


11.障碍器-JAVA5 API

CyclicBarrier c=CyclicBarrier(等待子线程数, 等待完毕需要执行的Runnable);

子线程需要调用c的await().来通知主线程已经完成了子任务。