Runnable接口的 run() 方法和start()方法

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();

 

posted @ 2022-08-01 15:00  VipSoft  阅读(606)  评论(0编辑  收藏  举报