Java菜鸟,初学多线程,使用的教材是《疯狂java讲义(第四版)》。有理解不到位的地方,欢迎批评指正~
(文章末尾有整个笔记的pdf版本和md版本)
Java 多线程笔记(1)——线程简介
Java 多线程笔记(2)——创建/启动线程
Java 多线程笔记(3)——线程的生命周期
Java 多线程笔记(4)——控制线程
Java 多线程笔记(5)——线程同步
Java 多线程笔记(6)——线程通信
4 控制线程
4.1 join线程
当在某个程序执行流(主)中调用其他线程(次)的join()方法时,调用线程(主)将被阻塞,直到join()方法加入的join线程(次)执行完为止。
join()方法通常由使用线程的程序调用,以将大问题划分成许多小问题,每个小问题分配一个线程。所有小问题处理后,在调用主线程来进一步操作。
public class JoinThread extends Thread {
public JoinThread(String name) {
super(name);
}
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(getName() + " " + i);
}
}
public static void main(String[] args) throws InterruptedException {
//启动子线程1
new JoinThread("New Thread").start();
for (int i = 0; i < 100; i++){
if (i == 20) {
//main线程调用了jt线程的join()方法
//main线程必须等jt线程执行结束才会向下执行
//子线程1不受影响
JoinThread jt = new JoinThread("Joined New Thread");
jt.start();
jt.join();
}
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}
4.2 后台线程
后台线程(Daemon Thread):后台运行,为其他的线程提供服务。又称守护线程或精灵线程,如JVM的垃圾回收线程。
所有前台线程死亡,后台线程会自动死亡。
public class DaemonThread extends Thread {
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(getName() + " " + i);
}
}
public static void main(String[] args) {
DaemonThread daemonThread = new DaemonThread();
//调用setDaemon()方法将线程设置成后台线程
daemonThread.setDaemon(true);
daemonThread.start();
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
//程序结束,前台线程(main线程)结束
//后台线程随之结束
}
}
4.3 线程睡眠
线程睡眠:让当前正在执行的线程暂停一段时间,并进入阻塞状态。睡眠期间,被睡眠的线程不会获得执行的机会,即使没有其他可执行的线程。
public class SleepThread {
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 10; i++) {
System.out.println("Time" + new Date());
//使用sleep()方法让当前线程暂停1s
Thread.sleep(1000);
}
}
}
4.4 线程让步
线程让步:让当前正在执行的线程暂停,但不会阻塞该线程,只是将该线程转入就绪状态。
当某个线程调用了yield()方法暂停之后,只有优先级与当前线程相同,或者优先级比当前线程更高的处于就绪状态的线程才会获得执行的机会。
public class YieldThread extends Thread {
public YieldThread(String name) {
super(name);
}
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println(getName() + " " + i);
if (i == 20) {
Thread.yield();
}
}
}
//在多CPU并行的环境下,yield()方法的功能有时不明显
//通常不建议使用yield()方法控制并发线程的执行
public static void main(String[] args) {
YieldThread yt1 = new YieldThread("高级");
//将yt1的优先级设为最高
yt1.setPriority(Thread.MAX_PRIORITY);
yt1.start();
YieldThread yt2 = new YieldThread("低级");
//将yt2的优先级设为最低
yt2.setPriority(Thread.MIN_PRIORITY);
yt2.start();
}
}
4.5 改变线程优先级
每个线程具有优先级,优先级较高的线程获得较多的执行机会,优先级较低的线程获得较少的执行机会。
每个线程默认优先级与他的父线程优先级相同。默认情况下,main线程具有普通优先级。
方法:setPriority(int newPriority),getPriority()
setPriority()方法的参数在1~10之间
也可以使用Thread类的静态常量
- MAX_PRIORITY: 10
- MIN_PRIORITY: 1
- NORM_PRIORITY: 5
尽量使用静态常量来设置优先值,以确保可移植性
完整笔记下载:
pdf版链接:https://pan.baidu.com/s/1AxAo3ZLwf5EwUV6i6yWp8Q
提取码:6jom
md文件链接:https://pan.baidu.com/s/1tX0HCJteEVwCoXC0Hkw68Q
提取码:99t1