第1章 Java多线程技能
1.1 使用Java多线程的两种方式
自定义一个类
Mythread
继承Thread
类,并重载run()
方法,再新建一个该类对象即可。1
2
3
4
5
6
7
8
9
10
11public class MyThread extends Thread {
public void run() {
super.run();
System.out.println("I am a MyThread obj!");
}
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}自定义一个类实现
Runnable
接口,并实现run()
方法。1
2
3
4
5
6
7
8
Thread anotherThread = new Thread(new Runnable() {
public void run() {
System.out.println("I am an anotherThread obj!");
}
});
anotherThread.start();值得注意的是,Thread()类本身也实现了Runnable方法,也就是说,可以将一个Thread类的对象来构造一个新的Thread类对象。这样就可以将一个Thread类对象obj1的run()方法交给其他
线程调用。
1.2 实例变量与线程安全
自定义线程类中的实例变量针对其他线程可以有共享
与不共享
两种方式。
(1)各线程间不共享数据
这种情况下的数据是线程安全的(2)各线程间不共享数据
这种情况下的数据是线程不安全的,需要考虑同步。
1.3 停止线程
停止一个线程有以下3种方法,准确的说,只有两种:
- 1)使用退出标志,使得线程正常退出,然后被OS 终止掉。
- 2)使用
Thread.interrupt()
中断一个线程 - 3)!!! 一定不要用
stop()
方法
1.4 yield()方法
yield()方法的作用是主动放弃当前得到的CPU时间片。至于放弃当前CPU时间片后何时再次得到时间片,那是OS考虑的事情,可能马上得到,也可能过一会儿得到,也有可能永远都得不到了。
1.5 线程的优先级
可以通过线程对象的setPriority()
方法设置线程的优先级,分别有以下3个常量 (Thread类静态常量):
- public final static int MIN_PRIORITY=1;
- public final static int NORM_PRIORITY=5;
- public final static int MAX_PRIORITY=10;
线程的优先级具有继承性,比如在A线程中新开了线程B,则线程B的优先级和A一样。
1.6 守护线程(Daemon)
通过线程对象的setDaemon()
方法将一个线程设置为守护线程,当仅剩余守护线程时,守护线程将被kill掉。