Thread和Runnable简介
Runable是一个接口,里面只有一个方法,启动多线程只需要实现这个接口,通过new Thread(new A())等方式新建线程
public interface Runnable { public abstract void run(); }
Thread是一个类,其实这个类本身实现了runable接口的
public class Thread implements Runnable { }
Thread和Runnable的异同点
- 相同:都是多线程的实现方式
- 不同:
- Thread类,Runable是接口,接口可以多实现,类只能单继承,
- Runnable还可以用于“资源的共享”。即,多个线程都是基于某一个Runnable对象建立的,它们会共享Runnable对象上的资源
继承Thead多线程的例子
class MyThread1 extends Thread{ private int ticket = 10; @Override public void run() { for (int i = 0; i < 20; i++) { if (this.ticket > 0) { //模拟网络延迟 try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(this.getName() + "卖票 : ticket " + this.ticket--); } } } } public class ThreadTest { public static void main(String[] args) { MyThread1 t1= new MyThread1(); MyThread1 t2= new MyThread1(); MyThread1 t3= new MyThread1(); t1.start(); t2.start(); t3.start(); } }
运行结果:
Thread-1卖票 : ticket 10 Thread-0卖票 : ticket 10 Thread-2卖票 : ticket 10 Thread-2卖票 : ticket 9 Thread-1卖票 : ticket 9 Thread-0卖票 : ticket 9 Thread-0卖票 : ticket 8 Thread-1卖票 : ticket 8 Thread-2卖票 : ticket 8 Thread-0卖票 : ticket 7 Thread-1卖票 : ticket 7 Thread-2卖票 : ticket 7 Thread-0卖票 : ticket 6 Thread-1卖票 : ticket 6 Thread-2卖票 : ticket 6 Thread-2卖票 : ticket 5 Thread-1卖票 : ticket 5 Thread-0卖票 : ticket 5 Thread-0卖票 : ticket 4 Thread-1卖票 : ticket 4 Thread-2卖票 : ticket 4 Thread-2卖票 : ticket 3 Thread-1卖票 : ticket 3 Thread-0卖票 : ticket 3 Thread-0卖票 : ticket 2 Thread-1卖票 : ticket 2 Thread-2卖票 : ticket 2 Thread-0卖票 : ticket 1 Thread-2卖票 : ticket 1 Thread-1卖票 : ticket 1
总结:
- MyThread继承于Thread,它是自定义个线程。每个MyThread都会卖出10张票
- 主线程main创建并启动3个MyThread子线程。每个子线程都各自卖出了10张票。
- 根据机器的不同,每次运行的结果是不一样的,有可能有些人看不到这么明显的效果,这也很正常。所谓的多线程,指的是两个线程的代码可以同时运行,而不必一个线程需要等待另一个线程内的代码执行完才可以运行。对于单核CPU来说,是无法做到真正的多线程的,每个时间点上,CPU都会执行特定的代码,由于CPU执行代码时间很快,所以两个线程的代码交替执行看起来像是同时执行的一样。那具体执行某段代码多少时间,就和分时机制系统有关了。分时系统把CPU时间划分为多个时间片,操作系统以时间片为单位片为单位各个线程的代码,越好的CPU分出的时间片越小。所以看不到明显效果也很正常,一个线程打印5句话本来就很快,可能在分出的时间片内就执行完成了
实现Runable多线程的例子
class MyThread implements Runnable { private int ticket = 10; @Override public void run() { for (int i = 0; i < 20; i++) { if (this.ticket > 0) { //try { // Thread.sleep(100); //} catch (InterruptedException e) { // e.printStackTrace(); //} System.out.println(Thread.currentThread().getName() + "卖票 : ticket " + this.ticket--); } } } } public class RunnableTest { public static void main(String[] args) { MyThread mt = new MyThread(); // 启动3个线程t1,t2,t3(它们共用一个Runnable对象),这3个线程一共卖10张票! Thread t1 = new Thread(mt); Thread t2 = new Thread(mt); Thread t3 = new Thread(mt); t1.start(); t2.start(); t3.start(); } }
运行结果:
Thread-0卖票 : ticket 10 Thread-2卖票 : ticket 8 Thread-1卖票 : ticket 9 Thread-2卖票 : ticket 6 Thread-0卖票 : ticket 7 Thread-2卖票 : ticket 4 Thread-1卖票 : ticket 5 Thread-2卖票 : ticket 2 Thread-0卖票 : ticket 3 Thread-1卖票 : ticket 1
总结:
- 主线程main创建并启动3个子线程,而且这3个子线程都是基于“t1这个Runnable对象”而创建的。运行结果是这3个子线程一共卖出了10张票。这说明它们是共享了MyThread接口的。
- 这个接口可以用于有共享资源的情况下
多线程(三)--实现多线程的两种方式
猜你喜欢
转载自blog.csdn.net/qq_25385555/article/details/79004179
今日推荐
周排行