Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java线程启动方法或方法_Java_Multithreading - Fatal编程技术网

java线程启动方法或方法

java线程启动方法或方法,java,multithreading,Java,Multithreading,此代码来自示例OCP/SCJP 我不太清楚为什么在运行之前调用Printx。 为什么这是有保证的 public class ConstructorOrRun extends Thread { private int x = 2; public ConstructorOrRun() throws Exception { x = 5; start(); } public void printX() throws Exception

此代码来自示例OCP/SCJP

我不太清楚为什么在运行之前调用Printx。 为什么这是有保证的

public class ConstructorOrRun extends Thread {

    private int x = 2;

    public ConstructorOrRun() throws Exception {
        x = 5;
        start();
    }

    public void printX() throws Exception {
        x = x - 1;
        System.out.print(x);
    }

    public void run() {
        x *= 2;
    }

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        new ConstructorOrRun().printX();

    }

}

ConstructorOrRun在主线程上立即返回,然后调用printX


无法保证在构造函数中调用start会导致在构造函数返回之前在另一个线程上启动运行,更不用说在另一个线程上完成运行了。事实上,如果有,我会感到惊讶。

我认为“保证”这个词在这里不合适。实际上,printx可能首先完成,因为相对于当前正在运行的线程执行litle算法所花费的时间,获取控制台的非争用锁并向其写入

这是一个比赛条件,但是,这将是一个非常坏的主意,依靠任何事情发生的第一。如果一个程序运行足够多的时间,各种交织都可能发生。无法保证哪件事会先发生在这里,最好避免做出假设

还有一个问题。构造函数由主线程调用,初始化x,然后启动一个新线程。新线程在run方法中修改x,但是没有任何东西需要使x的内容对新线程可见。使x易挥发将使其内容可见


还有一个问题:算术运算需要执行多个步骤,并且可能会受到其他线程的干扰。这不仅仅是哪一个操作将首先发生的问题,它们可能是交错的。修复此问题需要锁定或使用atomicInteger。

扩展线程是一种可怕的做法,除非您的目的是改变线程的工作方式。别说了,内森·休斯的回答有点轻描淡写。您不能依靠测试来确定程序是否是线程安全的。在一个操作系统版本上进行测试不会告诉您它是否可以在另一个操作系统版本上工作。在一个JRE版本中进行测试不会告诉您它是否可以在另一个JRE版本上工作,今天的测试也不会告诉您它明天是否可以工作。如果一个程序的正确性取决于比赛的结果,例如,在你的例子中设置x的比赛,那么无论测试说什么,程序都是错误的。@user3431327:我不知道你从哪里得到的,但是这些问题测试的是特定的目标,我不清楚这些目标是什么。