在java中不使用join()一个接一个地启动线程

Posted

技术标签:

【中文标题】在java中不使用join()一个接一个地启动线程【英文标题】:start thread one by one without using join() in java 【发布时间】:2017-10-26 13:47:51 【问题描述】:

我是java线程的新手,我对线程有一点了解,假设我有10个线程,我像这样一个一个地启动它

public class BaseRunnable implements Runnable 
    String ThreadNo;
    public  BaseRunnable(String ThreadNo) 
        // TODO Auto-generated constructor stub
        this.ThreadNo=ThreadNo;
    

    @Override
    public void run() 
        // TODO Auto-generated method stub

        for(int i=0;i<50;i++)
        
             System.out.println("Thread no "+ThreadNo+"  Running with index > "+i);
        
    

在主方法中

BaseRunnable runnable=new BaseRunnable("1");//run on main thread
BaseRunnable runnableTwo=new BaseRunnable("2");//run on main thread
BaseRunnable runnable3=new BaseRunnable("3");//run on main thread
BaseRunnable runnable4=new BaseRunnable("4");//run on main thread
BaseRunnable runnabl5=new BaseRunnable("5");//run on main thread
BaseRunnable runnable6=new BaseRunnable("6");//run on main thread
BaseRunnable runnable7=new BaseRunnable("7");//run on main thread
BaseRunnable runnable8=new BaseRunnable("8");//run on main thread


Thread one=new Thread(runnable);
Thread two=new Thread(runnableTwo);
Thread thr3=new Thread(runnable3);
Thread thr4=new Thread(runnable4);
Thread thr5=new Thread(runnabl5);
Thread thr6=new Thread(runnable6);
Thread thr7=new Thread(runnable7);
Thread thr8=new Thread(runnable8);

one.start();
two.start();
thr3.start();
thr4.start();
thr5.start();
thr6.start();
thr7.start();
thr8.start();

我知道如果我使用join(),我可以一个一个地运行线程(one.start(); one.join();)

我尝试了另一种使用同步的方法,它使一个线程一个接一个地运行,但它不是按顺序运行的,所以任何专家都帮我激活这个,比如第一个线程,没有join()的线程 2 等

请将此视为初学者的问题,请帮助

【问题讨论】:

如果有几个任务要做,但是这些任务必须按照一定的顺序完成,并且直到前一个任务完成才能开始下一个任务,那你为什么要尝试使用线程?请提供更多关于您正在尝试做的事情的背景信息。 我正在测试和学习线程,最近我在面试中遇到了一个问题来实现这一点,所以我开始弄清楚如何做到这一点。请考虑作为学习的学生。谢谢 你还记得确切的面试问题吗?它真的和你发布的问题一样吗? This 已旧但仍然适用。 不应手动启动线程。看看Executors 【参考方案1】:

您可以通过这种方式实现您的目标:

        List<BaseRunnable> list = new ArrayList<>();
        for (int i = 0; i < 8; i++) 
            list.add(new BaseRunnable(Integer.toString(i)));
        

        for (BaseRunnable baseRunnable : list) 
            Thread thread = new Thread(baseRunnable);
            thread.start();
            while (thread.isAlive()) 
                Thread.sleep(10);
            
        

【讨论】:

以上是关于在java中不使用join()一个接一个地启动线程的主要内容,如果未能解决你的问题,请参考以下文章

java join 方法的使用

Java Thread.join()详解--父线程等待子线程结束后再结束

多线程:控制线程

Java——使用多线程从list中不重复地取出数据并进行处理,给多线程任务添加单项任务计时和总耗时

Java——使用多线程从list中不重复地取出数据并进行处理,给多线程任务添加单项任务计时和总耗时

java多线程基本概述——join()方法