线程常用方法辨析(2)
概述
1.yield()
2.join()
3.总结
第1节 yield()方法
1. yield字面意思:放手,放弃,投降
2. yield()方法的意思是告诉CPU执行其他的线程,当前线程让出CPU的执 行权利
3. yield()方法不能保证使得当前正在运行的线程迅速转换到可运行的状态
4. yield()方法的作用就是将当前线程从执行中的状态转变到可执行状态
5. yield()方法不能保证其他线程一定能够执行,因为执行过yield()方法的线程当前依然是可执行的状态,有可能被cpu再次执行
6. 执行yield()方法的线程不会释放锁
public class Consumer extends Thread {
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("I am Consumer : Consumed Item " + i);
Thread.yield();
}
}
}
public class Producer extends Thread {
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("I am Producer : Produced Item " + i);
// Thread.yield();
}
}
}
public class YieldDemo {
public static void main(String[] args) {
Thread producer = new Producer();
Thread consumer = new Consumer();
// 最低优先级
producer.setPriority(Thread.MIN_PRIORITY);
// 最高优先级
consumer.setPriority(Thread.MAX_PRIORITY);
consumer.start();
producer.start();
}
}
I am Consumer : Consumed Item 0
I am Producer : Produced Item 0
I am Producer : Produced Item 1
I am Producer : Produced Item 2
I am Producer : Produced Item 3
I am Producer : Produced Item 4
I am Producer : Produced Item 5
I am Producer : Produced Item 6
I am Producer : Produced Item 7
I am Producer : Produced Item 8
I am Producer : Produced Item 9
I am Producer : Produced Item 10
I am Producer : Produced Item 11
I am Producer : Produced Item 12
I am Producer : Produced Item 13
I am Producer : Produced Item 14
I am Producer : Produced Item 15
I am Producer : Produced Item 16
I am Producer : Produced Item 17
I am Producer : Produced Item 18
I am Producer : Produced Item 19
I am Consumer : Consumed Item 1
I am Consumer : Consumed Item 2
I am Consumer : Consumed Item 3
I am Consumer : Consumed Item 4
I am Consumer : Consumed Item 5
I am Consumer : Consumed Item 6
I am Consumer : Consumed Item 7
I am Consumer : Consumed Item 8
I am Consumer : Consumed Item 9
I am Consumer : Consumed Item 10
I am Consumer : Consumed Item 11
I am Consumer : Consumed Item 12
I am Consumer : Consumed Item 13
I am Consumer : Consumed Item 14
I am Consumer : Consumed Item 15
I am Consumer : Consumed Item 16
I am Consumer : Consumed Item 17
I am Consumer : Consumed Item 18
I am Consumer : Consumed Item 19
第2节 join()
1. join()方法可以使得一个线程在另一个线程结束后再执行
2. 如果join()方法在一个线程实例上调用,
当前运行着的线程将阻塞直到这个线程执行完成了
3. join()方法可以设定超时时间,使得join()方法的影响在超时后无效
4. join()重载方法有:join(long millis),join(long millis, int nanos)
5. 当join()超时后,主方法和任务线程申请运行的时候是平等的
6. join()可以抛出InterruptedException对中断做出回应
public class JoinDemo {
public static void main(String[] args) throws InterruptedException
{
Thread thread2
= new Thread(() -> {
System.out.println("thread2 started");
System.out.println("thread2 sleeping for 2 seconds");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread2 completed");
});
Thread thread1 = new Thread(() -> {
try {
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread1 started");
System.out.println("thread1 sleeping for 2 seconds");
try
{
Thread.sleep(2000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("thread1 completed");
});
// 线程1启动
thread1.start();
// 线程1调用join()
// 问题:线程1和线程2的运行先后
// thread1.join();
thread2.start();
}
}
thread2 started
thread2 sleeping for 2 seconds
thread2 completed
thread1 started
thread1 sleeping for 2 seconds
thread1 completed
第3节 总结
1. Thread.sleep(long) 和Thread.yield()都是Thread类的静态方法,join()是由线程对象来调用
2. sleep()使线程从运行状态进入阻塞状态,超时后进入就绪态,
是否进入运行态就要看操作系统的内部调用机制
3. 如果Thread.sleep()/Thread.yield()使用在由synchronized锁定的代码块中,
那么在调用他们的过程当中,并不会释放锁。wait()方法会释放锁。
4. join()方法可以使得一个线程在另一个线程结束后再执行
5. yield()方法是让当前线程由运行状态进入就绪状态,然后让操作系统重新调度一次,
这次调度只会让处于就绪队列中比当前线程优先级高或者相等的线程运行,
很可能某个线程在调用了yield方法后,又被操作系统调度进来运行
6. wait()和notify()、notifyAll() 这三个方法用于协调多个线程对共享数据的存取,
必须在synchronized语句块内使用这三个方法,否则可能会抛出
(MonitorStateIlegalException,锁状态异常)