主线程礼让(yield)问题,这是肿么个情况?

电脑小童 发布于 2015/08/09 18:12
阅读 363
收藏 0

我想让main执行到一个程序让其他程序执行,使用yield方法却没有效果。

以下是相关代码:

    package com;


public class Test1 {
public static void main(String[] args) {

TheThread th1 = new TheThread("A");

Thread t = new Thread(th1);
t.start();

for(int i=0;i<50;i++){
System.out.println("主线程"+i);
if(i==10)
try {
Thread.yield();

} catch (Exception e) {
e.printStackTrace();
}
}
}
}


class TheThread implements Runnable{



private String name;

public TheThread(String name){
this.name=name;
}

@Override
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println(name+":"+i);
}
}

}


以下是结果:

    主线程0
A:0
主线程1
A:1
主线程2
A:2
主线程3
A:3
主线程4
主线程5
主线程6
主线程7
主线程8
主线程9
主线程10
主线程11
主线程12
主线程13
主线程14
主线程15
主线程16
主线程17
主线程18
主线程19
主线程20
主线程21
主线程22
主线程23
主线程24
主线程25
主线程26
主线程27
主线程28
主线程29
主线程30
主线程31
主线程32
主线程33
主线程34
主线程35
主线程36
主线程37
主线程38
主线程39
主线程40
主线程41
主线程42
主线程43
主线程44
主线程45
主线程46
主线程47
主线程48
主线程49
A:4
A:5
A:6
A:7
A:8
A:9
A:10
A:11
A:12
A:13
A:14
A:15
A:16
A:17
A:18
A:19
A:20
A:21
A:22
A:23
A:24
A:25
A:26
A:27
A:28
A:29
A:30
A:31
A:32
A:33
A:34
A:35
A:36
A:37
A:38
A:39
A:40
A:41
A:42
A:43
A:44
A:45
A:46
A:47
A:48
A:49


加载中
0
youlovebaby
youlovebaby

首先我说下,你这程序有问题,主线程是尽量别去阻塞的,你的程序我简单修改了下(注释部分取消掉就唤醒线程A了):

package test;


public class Test1 {
public static Object object = new Object();
public static void main(String[] args) {

TheThread th1 = new TheThread("A");
TheThread th2 = new TheThread("B");
Thread t1 = new Thread(th1);
Thread t2 = new Thread(th2);
t1.start();
t2.start();


for(int i=0;i<50;i++){
System.out.println("主线程"+i);
if(i==10){
synchronized(object){
try {
object.wait();
}catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}




class TheThread implements Runnable{


private String name;
public static Object object = new Object();

public TheThread(String name){
this.name=name;
}

@Override
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println(name+":"+i);
if(i==10){
if(name.equals("A")){// 阻塞线程A
synchronized(object){
try {
object.wait();
}catch (Exception e) {
e.printStackTrace();
}
}
}
}else {  
synchronized(object){
try {
// if(name.equals("B"))// 唤醒线程A
// object.notify();
}catch (Exception e) {
e.printStackTrace();
}
}
}
}
}


}


youlovebaby
youlovebaby
回复 @电脑小童 : yield的基本释义:Causes the currently executing thread object to temporarily pause and allow other threads to execute,使当前正在执行线程对象临时暂停并允许其他线程来执行,所以yield只是是线程临时暂停,并不是剥夺线程资源更不是杀死线程,等其他线程执行完,它当然要执行
电脑小童
电脑小童
你好,我只是想研究下yield的用法。
返回顶部
顶部