Java高并发程序设计笔记(二)

时间:2022-12-03 17:57:21

线程的基本操作:

新建线程:start()和run()区别

start() 会新建一个线程并让线程执行run方法()的代码 (不使用)
run()只是在当前线程中串行执行run()方法中的代码

终止线程:stop()

stop()方法过于暴力,强行把执行到一半的线程终止,并立即释放这个线程持有的锁,而这些锁是用来维护数据对象一致性的,若此时写线程写入数据正写到一半,并强行终止,那么对象就会被写坏,与此同时由于锁已经被释放,另外一个等待该锁的线程就会读取这个对象,杯具就此发生(不使用)

中断线程:inerrupt()

使用中断方法interrupt()代替stop(),线程中断不会使线程即刻退出,而是给线程发送一个通知,告知目标线程有人希望你退出啦!目标线程接到通知后如何处理完全由目标线程自行决定,这点很重要
Thread 1=new Thread{
@override
public void run()
{
while(true)
{
if(Thread.currentThread().isInterrupt())
{
System.out.println("inerrupt!");
break;
}
Thread.yield();
}
}
};

等待wait()和通知notify()

这两个方法是在Object()类中的,所以任何一个对象都可以调用这两个方法。
比如当在A线程中调用了obj.wait() 方法,那么A就会停止继续执行而转为等待状态。一直等到其他线程调用了obj.notify()方法为止,这是obj对象俨然成为多个线程间的有效通信手段。

wait()和notify()是如何工作的呢?如果一个线程调用了object.wait(),就会进入object对象的等待队列,在这个队列中会有多个线程。当object.notify()被调用时,就会从这个等待队列中,随机选择一个线程,并将其唤醒,这个选择是不公平的,并不是先等待的线程会被优先选择,这个选择是完全随机的。
注意:wait()和notify()并不是随便调用的,必须包含在synchronized语句中。

wait()和sleep()区别
都可以让线程等待若干时间,除了wait()可以被唤醒外,另一个主要的区别是wait()方法会释放目标的锁,而sleep()方法不会释放任何资源。

等待线程结束join() 和谦让yield()

一个线程的输入可能非常依赖于另外一个或者多个线程的输出,此时这个线程需要等待其他线程执行完毕,才能继续执行。join()方法表示无线等待,一直阻塞当前线程,知道目标线程执行完毕。join(long millis)方法给出了最大等待时间,如果超过给定的时间目标还在执行,当前线程会因为等不及了而继续往下执行。join的本质是调用wait()在当前线程的对象实例上。

Thread.yield()是一个有趣的方法,他会是当前线程让出CPU,但是让出CPU并不代表当前线程不执行了。当前线程让出CPU后,还会进行CPU资源的争夺,但是是否能够再次被分配到就不一定了。如果一个线程不是很重要,或者优先级非常低,而且又害怕占用太多的CPU资源,可以适当的时候调用yield(),给其他重要的线程一些工作的机会。