这边我们来说一下java Thread类中的方法。首先我们来说yield方法。我们再说yield之前我们先看一下java 多线程的生命周期。
一般分为四种状态 new runnable runing
下面我们来试一段代码
package ThreadTest;
public class YieldTest {
public static void main(String[] args) {
Thread test1 = new Yield("test1");
Thread test2 = new Yield("test2");
Thread test3 = new Yield("test3");
test1.start();
test2.start();
test3.start();
}
}
//继承Thread
class Yield extends Thread{
public Yield(){
}
public Yield(String name){
super(name);
}
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+": "+i);
if(i%20==0){
System.out.println(Thread.currentThread().getName()+": "+ i +" yield一下");
Thread.yield();
}
}
}
}
可以看到执行了yield之后。其实线程是放出一点资源的。或许看的不是很明显。因为我们现在的电脑cpu大多是多核心多线程的。在test1交出cpu的资源时。其他线程已经在执行过程中。所以这个test1在交出cpu资源之后瞬间又进入running的状态
那么我们是否可以设想一下这玩意的用处的场景。首先这个操作会不会释放锁呢?我们来看一下
package ThreadTest;
public class YieldTest {
public static void main(String[] args) {
Thread test1 = new Yield("test1");
Thread test2 = new Yield("test2");
Thread test3 = new Yield("test3");
test1.start();
test2.start();
test3.start();
}
}
//继承Thread
class Yield extends Thread{
private static Object lock = new Object();
public Yield(){
}
public Yield(String name){
super(name);
}
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (lock){
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+": "+i);
if(i%2==0){
System.out.println(Thread.currentThread().getName()+": "+ i +" yield一下");
Thread.yield();
}
}
}
}
}
运算结果:
test1: 0
test1: 0 yield一下
test1: 1
test1: 2
test1: 2 yield一下
test1: 3
test1: 4
test1: 4 yield一下
test1: 5
test1: 6
test1: 6 yield一下
test1: 7
test1: 8
test1: 8 yield一下
test1: 9
test3: 0
test3: 0 yield一下
test3: 1
test3: 2
test3: 2 yield一下
test3: 3
test3: 4
test3: 4 yield一下
test3: 5
test3: 6
test3: 6 yield一下
test3: 7
test3: 8
test3: 8 yield一下
test3: 9
test2: 0
test2: 0 yield一下
test2: 1
test2: 2
test2: 2 yield一下
test2: 3
test2: 4
test2: 4 yield一下
test2: 5
test2: 6
test2: 6 yield一下
test2: 7
test2: 8
test2: 8 yield一下
test2: 9
发现了其实并不会释放锁。yield会放弃cpu资源重新抢夺,但是不会释放锁。那么既然它不能释放锁。说明这个不适合在用锁的环境中使用。
那么我们什么时候使用这个yield呢?线程其实是分线程的优先级的,虽然线程中优先级高的不全是先执行结束。但是优先级高的线程总是先执行结束。那么我们可以设想一下,如果现在有两个线程一个是优先级高的线程,进行的是重要的操作比如是付工资,
但是还有一个优先级比较低的线程是进行人员上周考勤的统计。优先级较低的线程其实可能占用的cpu资源的时间长,所以我们希望把资源更多的交给付工资这个线程。所以我们可以把yield来做。