1 package day2_4;
2
3 /**
4 * 创建线程的方式二:实现Runnable接口
5 * 1.实现Runnable接口,并实现其抽象方法run()
6 * 2.创建这个实现类的对象
7 * 3.将这个是实现类对象作为参数传递到Thread类的构造器中,并创建Thread类的对象
8 * 4.调用Thread类的start()
9 *
10 *
11 *比较创建线程的两种方式
12 * 开发中,优先选择:实现Runnable接口的方式
13 * 原因:1.实现的方式没有类的单继承的局限性
14 * 2.实现的方式更适合处理多个线程共享数据的情况
15 *
16 * 联系:public class Thread implements Runnable
17 * 相同点:两种方式都需要重写run(),将线程要执行的逻辑声明在run()中
18 * 目前两种方式,要想启动线程,都是调用Thread类的start()
19 *
20 *
21 *
22 * @Author Tianhao
23 * @create 2021-02-04-10:59
24 */
25
26
27
28
29 class Mthread implements Runnable {
30
31 @Override
32 public void run() {
33 for (int i = 0; i < 100; i++) {
34 if (i % 2 == 0) {
35 System.out.println(Thread.currentThread().getName() + ":" + i);
36 }
37 }
38 }
39 }
40
41
42 public class ThreadTest2 {
43 public static void main(String[] args) {
44 Mthread mthread = new Mthread();
45 Thread t = new Thread(mthread);
46 t.setName("线程一");
47 t.start(); //底层是调用Thread类中Runnab类型的成员变量target的run()
48
49 //再启动一个线程
50 Thread t2 = new Thread(mthread);
51 t2.setName("线程二");
52 t2.start();
53
54 Thread.currentThread().setName("main线程");
55 for (int i = 0; i < 100; i++) {
56 if (i % 2 == 0) {
57 if (i == 20) {
58 //yield() 释放当前cup的执行权
59 Thread.currentThread().yield();
60 }
61 System.out.println(Thread.currentThread().getName() + ":" + i);
62 }
63 }
64 }
65 }