很惭愧,一直以来,都是开发的单进程或者单线程程序,我所了解的多线程也基本都是书本上的知识而已。现在看到《Java特种兵》的并发编程,需要了解多线程基础,因此将我所理解的多线程记下来,欢迎大家一起讨论,共同进步!!!
1、线程的创建
Java中创建线程是通过 java.lang.Thread类。启动线程可以通过Thread.start()方法,调用native方法实现创建真正的线程。线程执行的内容是Thread.run()方法内部的代码,如果不先执行Thread.start(),则只是在主线程中执行了一个普通的run()方法,没有创建新的线程来执行。
有两个常用途径可以创建我们自己的线程:
(1) 实现Runnable接口,需要在Runnable实现类中实现自己的run()方法;将Runnable类型的任务作为创建 Thread对象时构造方法的参数,这个参数会被设置到Thread的一个"target"属性上,Thread类默认的run()方法会调用这个target的run()方法。因此,Runnable实例可以理解为一个线程要执行的任务。
(2) 继承Thread类,在子类的run()方法中实现自己的业务逻辑。
执行main()方法的线程是主线程,自定义的线程都是子线程。
2、Thread.join()方法:
当前线程执行子线程的Thread.join(),当前线程会一直wait(),直到子线程的isAlive()返回false。因此,直到子线程执行完,才会执行Thread.join()之后的代码。
3、中断子线程
(1) Thread.stop() ,使得子线程抛出java.lang.ThreadDeath的错误,如果抛出异常时执行的代码段有try...catch,则会进入catch块;
但是这个Thread.stop()方法被Deprecated了,应该是对程序执行的顺序控制有弊,不建议使用了。
(2) 利用volatile类型的标识变量,需要程序轮询该变量的值。缺点是,如果程序正在阻塞,则达不到想要的效果了,因为代码没有继续执行下去;
(3) 利用Thread.interrupt(), 当子线程处于阻塞状态时,会重置中断状态(根据阻塞原因不同,所置状态可能不同);如果程序未阻塞,则仅仅是设置了线程的中断状态,正常代码还会继续执行。