Java实现多线程的三种方法
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口,这JUC并发包下的,属于比较高级的用法
这里讲的是第二种方法.
本篇内容:
- 演示如何通过Runnable接口实现多线程
- 演示多线程模拟龟兔赛跑
1. 通过实现Runnable接口
public class ThreadDemo { public static void main(String[] args) { //创建Runnable接口的实现类对象 TicketWinow tw = new TicketWinow(); //创建代理类,并把实现类对象作为参数传给代理类的构造方法 Thread t = new Thread(tw, "Windows00"); t.start(); //下面的循环只是把上面的两步合并成一步而已 for (int i = 0; i < 5; i++) { new Thread(new TicketWinow()).start(); } } } class TicketWinow implements Runnable { private static int ticketNum = 50; //重写run()方法 @Override public void run() { while (ticketNum > 0) { System.out.println(Thread.currentThread().getName() + "正在售第" + (ticketNum--) + "张票!"); } } }
2.用Runnable接口实现多线程模拟龟兔赛跑
public class ThreadDemo { public static void main(String[] args) throws InterruptedException { Racer racer = new Racer(); new Thread(racer, "乌龟").start(); new Thread(racer, "兔子").start(); } } class Racer implements Runnable { private String winner; //重写run()方法 @Override public void run() { for (int step = 0; step <= 100; step++) { //模拟让兔子睡觉 if(Thread.currentThread().getName().equals("兔子") && step%10==0 ){ try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName() + "跑了第" + step + "步."); boolean flag = isGameOver(step); if (flag) { break; } } } public boolean isGameOver(int steps) { if (winner != null) { return true; } else { if (steps == 100) { winner = Thread.currentThread().getName(); System.out.println("胜利者是:" + winner); return true; } } return false; } }
重点:
Thread.sleep(int i);//暂停线程i秒 Thread.currentThread().getName()//获得当前线程名字