java - 加入不同的工作方式

标签 java multithreading

在这里,我正在学习 java 中的线程,并且偶然发现了 join()。现在,join() 应该让当前线程退出执行,然后下一个线程应该开始。但是,我得到了不同的输出。 我的代码是

 public class join extends Thread {
    public void run() {
        for (int i = 0; i < 5; i++) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                System.out.println(e);
            }
            System.out.println(i);
        }
    }
}

class bhago4 
{
    public static void main(String args[]) throws IOException 
{

        join j1 = new join();
        join j2 = new join();
        join j3 = new join();
        j3.start();
        j1.start();
        try {
            j1.join();

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

        }
        j2.start();
    }
}

我得到的输出是:

0
0
1
1
2
2
3
3
4
4
0
1
2
3
4

现在根据我的理解,当 j3 启动时它应该打印 0,然后它 hibernate 500 毫秒,直到 j1 启动,它应该继续直到它结束,但是这并没有发生。两个线程的 o/p 是交替的。为什么会这样?

最佳答案

为了更好地理解输出,更改代码如下

join类中添加构造函数

 public join(String name){
    super(name);
 }

将打印语句更改为

System.out.println(i+" from "+Thread.currentThread().getName());

更改线程创建如下:

join j1 = new join("j1");
join j2 = new join("j2");
join j3 = new join("j3");

输出:

0 from j3
0 from j1
1 from j3
1 from j1
2 from j3
2 from j1
3 from j3
3 from j1
4 from j3
4 from j1
0 from j2
1 from j2
2 from j2
3 from j2
4 from j2

join()允许线程死亡。

顺序:

  1. j3 开始了。睡了 500 毫秒并打印了 0。
  2. j1 并行启动。 sleep 500 毫秒并打印 0。如果将 sleep 时间从 500 毫秒更改为 50 毫秒,则输出在 j1j3,并行运行。
  3. 两者并行运行并在 1、2、3、4 之后打印, hibernate 时间为 500 毫秒。
  4. 通过调用 join(),您正在等待 j1 结束。
  5. 你在j1 死后开始了j2j3 到那时已经完成。

关于java - 加入不同的工作方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44032100/

相关文章:

java - 如何以所需的方式对 REST API 响应进行排序?

Java获取没有子字符串的文件扩展名

python - Django后台无限循环进程管理

java - 如何在不再次部署整个程序的情况下为接口(interface)添加新的实现?

java - 使用 Java 从 XML 文件获取属性

java - 使用 Apache Poi 复制 Excel 颜色

Android清除webview线程,释放内存,避免OutOfMemoryError

java - 调用notify()后什么时候锁才真正释放

python - Python强制子进程失败并获得不为零的返回码

c - 如何解决localtime_r时区段错误?