1.start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行,等待分配到CPU后继续执行未完的run()方法。 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。然后CPU再调度其它线程。即分配到cpu时执行未完的run()函数。
2.run()方法当作普通方法的方式调用。程序还是要顺序执行,要等待run方法体执行完毕后,才可继续执行下面的代码; 程序中只有主线程——这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。
@Test public void RunnableTest() throws InterruptedException { Runner1 runner1 = new Runner1(); Runner2 runner2 = new Runner2(); // Thread(Runnable target) 分配新的 Thread 对象。 Thread thread1 = new Thread(runner1); Thread thread2 = new Thread(runner2); // thread1.start(); // thread2.start(); thread1.run(); thread2.run(); System.out.print("阻塞当前线程,直到倒数计数器倒数到0"); new CountDownLatch(1).await(); } class Runner1 implements Runnable { // 实现了Runnable接口,jdk就知道这个类是一个线程 public void run() { for (int i = 0; i < 10; i++) { try { TimeUnit.SECONDS.sleep(1); System.out.println("进入Runner1运行状态——————————" + i); } catch (InterruptedException e) { e.printStackTrace(); } } } } class Runner2 implements Runnable { // 实现了Runnable接口,jdk就知道这个类是一个线程 public void run() { for (int i = 0; i < 10; i++) { try { TimeUnit.SECONDS.sleep(2); System.out.println("进入Runner2 运行状态——————————" + i); } catch (InterruptedException e) { e.printStackTrace(); } } } }
Lambda
new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + "新建线程"); } } ).start(); new Thread(() -> System.out.println(Thread.currentThread().getName() + "新建线程")).start();