1. 新建状态(New) : 线程对象被new后,就进入了新建状态。例如,Thread thread = new Thread()。 2. 就绪状态(Runnable): 线程对象被创建后,执行start(),此时完成资源分配,随时会被CPU调度掉 3. 运行状态(Running) : 线程获取CPU执行,开始干活。 4.阻塞状态(Blocked) : 线程失去了CPU使用权,暂时不运行。 5...
publicclassSonextendsThread {publicvoidrun() { ... } } public class Test { public static void main(String[] args) { Son s = new Son(); s.start(); //1 s.run(); //2 s.join();//3 } } 如上代码,有主线程main 和 线程 s: 1)如果只写注释1处的s.start()代码,表示s对象调用了...
//线程状态间的状态转换:NEW->RUNNABLE->TIME_WAITING->RUNNABLE->TERMINATEDLOGGER.info("===线程状态间的状态转换NEW->RUNNABLE->TIME_WAITING->RUNNABLE->TERMINATED===");//定义一个内部线程Thread thread =newThread(() ->{ LOGGER.info("2.执行thread.start()之后,线程的状态:" +Thread.currentThread()...
publicclassTestJoin{publicstaticvoidmain(String[]args){StringthreadName=Thread.currentThread().getName();System.out.println(threadName+" start.");ThreadBtb=newThreadB();ThreadAta=newThreadA(tb);try{tb.start();TimeUnit.SECONDS.sleep(2);ta.start();// ta.join(); // 这里注释掉}catch(Interr...
thread2.start(); thread.join(); //子线程阻塞主线程,待子线程运行结束 thread2.join(); //子线程阻塞主线程,待子线程运行结束 Thread.sleep(1000); System.out.println("主线程运行结束!"); } } 1. 2. 3. 4. 5. 6. 7. 8. 9.
使用了join()方法的情况: 代码语言:javascript 复制 publicstaticvoidmain(String[]args){System.out.println("MainThread run start.");//启动一个子线程Thread threadA=newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("threadA run start.");try{Thread.sleep(1000);}catch(Exception e...
Current Thread: Thread-1 0 Current Thread: Thread-1 1 Current Thread: Thread-2 0 Current Thread: Thread-2 1 可以看到,苦逼的三个线程都被拉到了主线程顺序执行。 现在,删掉两行代码: john2.join; john3.join; 再次运行: CurrentThread: Thread-0 ...
System.out.println("Thread-B:"+i); } }catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args){ new B().start(); } } 观察结果:在线程B的run方法中启动类线程A的start方法和join(),打印的结果没有交叉执行。可以得出上面的结论。感兴趣的同学可以将线程a.join...
public final void join() throws InterruptedException { join(0); } 通过查看源码可以知道join()和join(long millis, int nanos)最终都是调用join(long millis),对于join(long millis)来说中间的逻辑就是如果给定的等待时间是0的话,表示主线程永远的等待,直到子线程执行完毕。至于t1.join()为什么不是子线程的暂...
Threadt=newAThread();t.start();t.join(); 二、为什么要用join()方法 在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后再结束,这个时候就要用到...