启动新线程后无法访问表达式

Posted

技术标签:

【中文标题】启动新线程后无法访问表达式【英文标题】:Unreachable expression after launch of new thread 【发布时间】:2011-04-28 17:58:30 【问题描述】:

当下面的代码运行时,它会启动线程 r,因为它的输出被接收到,但测试短语永远不会输出,尽管没有输出表明错误的错误。为什么这无法通过线程启动?它会等待线程停止后再继续吗?

while(x<y)
    Runnable r = new Rule1(2, 0);
    new Thread(r).start();
    System.out.println("value of x is: " + x);
    x++;

我已经修改了 rule1 方法,以便更快地完成。完成后,“x 的值是”字符串将写入控制台。这意味着我的主要方法正在等待线程的完成。我认为通过启动一个线程,它将单独运行,从而允许主线程和新线程同时运行。我在这个假设上错了吗? 这是 rule1 的代码示例

    public class Rule1 implements Runnable 

 public Rule1(int z, int q)

        //do stuff

        

        public void run()
        

【问题讨论】:

你的线旋转得很厉害吗?它不会等待线程停止。虽然你的代码很危险,因为线程超出了范围,所以你以后不会再加入它。 你的意思是,文本“x 的值为:”永远不会进入控制台? 您可以发布您的 Rule1 课程的代码吗?可能是它的 run 方法中的某些东西导致了问题。 @highlycaffinenated - 因为它正在启动一个单独的线程,所以不管这个新创建的线程中发生什么,这段代码所在的主线程是否应该继续运行? @SB - 你的意思是努力旋转是什么意思?你是什​​么意思走出范围并且不会加入?它运行一个方法,然后在达到预期结果时自行终止,如果这澄清了任何事情 【参考方案1】:

可能是条件 x

【讨论】:

我进入循环运行线程并得到它的结果,然后仅此而已,所以 x 你测试过 Rule1 的构造函数结束了吗?如果不是 new Thread(r).start();永远达不到 构造方法有问题。谢谢【参考方案2】:

Î 无法重现您所描述的行为;代码

public static void main(String[] args) throws Exception 
    int y = 10;
    int x = 0;
    while(x<y)
        Runnable r = new Runnable() 
            @Override
            public void run() 
                for (;;) 

                
            
        ;
        new Thread(r).start();
        System.out.println("value of x is: " + x);
        x++;
    

产生输出

value of x is: 0
value of x is: 1
value of x is: 2
value of x is: 3
value of x is: 4
value of x is: 5
value of x is: 6
value of x is: 7
value of x is: 8
value of x is: 9

【讨论】:

以上是关于启动新线程后无法访问表达式的主要内容,如果未能解决你的问题,请参考以下文章

STS 配置tomcat以后,无法访问

C#无法访问已释放的对象

vue2启动成功了,但是无法访问

无法访问已释放的对象,该怎么解决

启动jenkins后无法访问,如何排错

laravel新创建的模块路由无法访问