实现Runnable
-
定义MyRunnable类实现Runnable接口
-
实现run()方法,编写线程执行体
-
创建线程对象,调用start()方法启动线程
//创建线程方式2:实现runnable接口,重写run方法,执行线程需要丢入runnable接口实现类,调用start方法 public class TestThread3 implements Runnable{ @Override public void run() { //run方法线程体 for (int i = 0; i < 20; i++) { System.out.println("我在听音乐"+i); } } public static void main(String[] args) { //创建runnable接口的实现类对象 TestThread3 testThread3 = new TestThread3(); //创建线程对象,通过线程对象来开启我们的s线程,代理 // Thread thread = new Thread(testThread3); // // thread.start(); new Thread(testThread3).start(); for (int i = 0; i < 20; i++) { System.out.println("我在写作业"+i); } } }
Thread 和Runnable的区别
-
继承Thread类
-
子类继承Thread类具备多线程能力
-
启动线程:子类对象.start()
-
不建议使用:避免OOP单继承局限性
-
-
实现Runnable接口
-
实现接口Runnable具有多线程能力
-
启动线程:传入目标对象+Thread对象.start()
-
推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
-
多个线程同时操作同一个对象
-
火车票实例
public class TestThread4 implements Runnable{ // 票数 private int ticketNums = 10; @Override public void run() { while (true){ if (ticketNums <= 0){ break; } // 模拟延迟 // try { // Thread.sleep(200); // } catch (InterruptedException e) { // e.printStackTrace(); // } System.out.println(Thread.currentThread().getName()+"拿到了第"+ticketNums--+"张票"); } } public static void main(String[] args) { TestThread4 t4 = new TestThread4(); new Thread(t4,"小明").start(); new Thread(t4,"小红").start(); new Thread(t4,"小刚").start(); } }