Java多线程问题 子线程无限循环导致主线程无法执行

代码如下,想知道为什么main方法中的if语句无法执行?想的是让if判断程序是否结束,但是程序好像一直结束不了

class Left extends Thread
{
int n = 0;
public void run()
{
while(true)
{
n++;
System.out.printf("\n%s","Left");
try
{
sleep((int)(Math.random()*100)+100);
}
catch(InterruptedException e) {}
}
}
}

class Right extends Thread
{
int n = 0;
public void run()
{
while(true)
{
n++;
System.out.printf("\n%40s","Right");
try
{
sleep((int)(Math.random()*100)+100);
}
catch(InterruptedException e){}
}
}
}

public class Example8_3
{
public static void main(String args[])
{
Left left = new Left();
Right right = new Right();
left.start();
right.start();

while(true)
{
if(left.n>=8 || right.n>=8) // 这一句好像永远也运行不到
System.exit(0);
}
}
}

我测试了一下,这个判断语句是已经执行了,就在第一句语句之前进行的,不信可以把if判断去掉,程序就一句也不执行。说明什么,说明这个语句exit已经执行,不过,对于线程的终结应该是在线程的循环内部进行定义,在线程的外部限制,好像不合适。

class Left extends Thread{
    int n = 0;
    public void run(){
        while(n <= 8){        
            n++;
            System.out.printf("\n%s","Left");
            System.out.print(n);
            try{
                sleep((int)(Math.random()*100)+100);
            }
            catch(InterruptedException e) {}
        }
    }
}

追问

就我是想在主线程main中判断left和right中的n是否到了8,到了就exit结束所有线程嘛,但是按我那样写似乎是main中读取不了n进行判断,如果把main方法的循环改成:
while(true)
{
if(left.n>=8 || right.n>=8) {
System.out.println("end");
System.exit(0);
}
}
结果不会输出“end”诶,想知道为什么不行

温馨提示:内容为网友见解,仅供参考
第1个回答  2018-11-19
在主线程的循环中输出,可以看到是主线程忙,没执行子线程,等一段时间就能结束了。

java线程for循环没有循环完成就停止了,这是为什么?
多线程需要基础学好点。在来开发,否则总有莫名其妙的事情冒出来。而自己无法解释。你这个问题很简单。你要main主线程1秒后输出list集合数据。在你代码中这写法本身是错误的,因为你有2个子线程,有锁,安全地往list中加2千个数据,却每次要等待1毫秒,估算2千数据你程序的加完需要2秒多时间,在1秒后...

java死锁是如何产生的?
在多线程环境下,多个进程竞争有限资源时,死锁问题可能产生。当进程请求资源而无可用资源时,进入等待状态。若所申请资源被其他等待进程占用,进程可能无法改变状态。死锁在Java多线程编程中常见,导致程序卡死,无法执行。死锁的形成原因主要有三点:1. 当前线程持有其他线程所需资源,且等待其他线程所拥有...

java线程问题,线程为什么不能一起进行?
试试把Display.getDefault().syncExec这个方法换成Display.getDefault().asyncExec这是 据说syncExec会阻塞当前线程去完成他的内容,等待结果后释放资源

Java多线程我用了同步代码块之后,为什么一直都是主线程在执行,别的线...
你的synchronized将while循环都锁住了,所以其中一个线程会将整个while循环执行玩再走其他线程,但你的共享数据这时候已经被循环至0了,所以只有一个线程在执行

java为什么运行不了
检查代码逻辑是否正确:通过阅读代码,确保代码的执行流程是正确的。检查代码中是否有未处理的异常:使用try-except语句来捕获和处理异常。检查代码中是否有死循环:确保循环条件是正确的,并且在循环内部有退出循环的机制。检查代码中是否有堵塞操作:确保堵塞操作能够得到及时的响应,或者使用多线程或异步操作...

帮帮忙!java中多线程运行累加和程序问题
每个线程不可能执行30000次i++,因为另外一个现成的i++也会改变i的值。关键一点是,循环变量在各个线程中都是相同的,是同一个i,所以总循环次数是大致一样的。之所以说大致一样,是因为在i++执行过程中线程调度的几率很小。如果恰好在这个时候调度,那么循环次数就不会是30000 ...

java多线程的问题为何输出结果只有一个?
1、主要是tt.join的问题。2、当子线程开启后,主线程和子线程是并发或并行执行的,会多线程输出。但是tt.join是指将tt线程与主线程(即tt.join这段代码所运行时候的线程)合并,即等tt.join运行完后执行刚刚的主线程。而你的tt线程中的run()方法为:while(true)所以tt.join之后,tt一直在运行,故...

关于java多线程的疑问,为何单步没问题的程序去除断点后运行就会有问题...
用测试类跑的吧?测试类的主线程结束之后,容器就直接关掉了,你开的那些线程已经没有运行环境了,所以你让主线程等下在结束,容器保持开启状态,其他线程才能执行完;这个问题在程序正常启动的时候是不存在的。

java+多线程异步堆栈实验中可能出现的问题?
会导致线程切换的开销增大,从而影响程序的性能。5. 异常处理问题:在异步堆栈实验中,如果任务出现异常,需要及时捕获并处理,否则可能会导致程序崩溃。6. 调试问题:多线程异步堆栈实验中,由于多个线程同时执行,调试会变得困难。需要使用合适的调试工具和技巧,例如断点调试、日志输出等。

Java线程问题:当一个目标对象被多个线程共享时候
二三个人没有的吃了,如果多线程的话,一人一口,轮着吃,大家都有吃到的机会了。但是粥始终是那一碗粥。线程的生命周期java基础的书上都有写。不知道我说的你能明白不。哦,对,你说的这个一个对象被多个线程调用,如果线程做了休眠或者其它的处理,还可能还存在死锁的问题。出现无法执行的现象。

相似回答