线程的两种实现方式

线程有两种实现方式

一,Thread类

  public class Thread implements Runnable{

  }

二,Runnable接口

  public interface Runnable{

    public abstract void run();  

}

区别:Thread是一个类,他继承了runnable接口,而runnable是一个接口,

一个类只能有一个父类,但是可以有多个接口,所以在拓展型方面,ruannale有更好的拓展性,更加灵活

Runnable还可以用于资源共享

1. Thread的多线程示例

下面通过示例更好的理解Thread和Runnable,借鉴网上一个例子比较具有说服性的例子。

 1 // ThreadTest.java 源码
 2 class MyThread extends Thread{
 3     private int ticket=10;
 4     public void run(){
 5         for(int i=0;i<20;i++){
 6             if(this.ticket>0){
 7                 System.out.println(this.getName()+" 卖票:ticket"+this.ticket--);
 8             }
 9         }
10     }
11 };
12
13 public class ThreadTest {
14     public static void main(String[] args) {
15         // 启动3个线程t1,t2,t3;每个线程各卖10张票!
16         MyThread t1=new MyThread();
17         MyThread t2=new MyThread();
18         MyThread t3=new MyThread();
19         t1.start();
20         t2.start();
21         t3.start();
22     }
23 } 

运行结果

Thread-0 卖票:ticket10
Thread-1 卖票:ticket10
Thread-2 卖票:ticket10
Thread-1 卖票:ticket9
Thread-0 卖票:ticket9
Thread-1 卖票:ticket8
Thread-2 卖票:ticket9
Thread-1 卖票:ticket7
Thread-0 卖票:ticket8
Thread-1 卖票:ticket6
Thread-2 卖票:ticket8
Thread-1 卖票:ticket5
Thread-0 卖票:ticket7
Thread-1 卖票:ticket4
Thread-2 卖票:ticket7
Thread-1 卖票:ticket3
Thread-0 卖票:ticket6
Thread-1 卖票:ticket2
Thread-2 卖票:ticket6
Thread-2 卖票:ticket5
Thread-2 卖票:ticket4
Thread-1 卖票:ticket1
Thread-0 卖票:ticket5
Thread-2 卖票:ticket3
Thread-0 卖票:ticket4
Thread-2 卖票:ticket2
Thread-0 卖票:ticket3
Thread-2 卖票:ticket1
Thread-0 卖票:ticket2
Thread-0 卖票:ticket1

结果说明
(01) MyThread继承于Thread,它是自定义个线程。每个MyThread都会卖出10张票。
(02) 主线程main创建并启动3个MyThread子线程。每个子线程都各自卖出了10张票。

2. Runnable的多线程示例

下面,我们对上面的程序进行修改。通过Runnable实现一个接口,从而实现多线程。

 1 // RunnableTest.java 源码
 2 class MyThread implements Runnable{
 3     private int ticket=10;
 4     public void run(){
 5         for(int i=0;i<20;i++){
 6             if(this.ticket>0){
 7                 System.out.println(Thread.currentThread().getName()+" 卖票:ticket"+this.ticket--);
 8             }
 9         }
10     }
11 };
12
13 public class RunnableTest {
14     public static void main(String[] args) {
15         MyThread mt=new MyThread();
16
17         // 启动3个线程t1,t2,t3(它们共用一个Runnable对象),这3个线程一共卖10张票!
18         Thread t1=new Thread(mt);
19         Thread t2=new Thread(mt);
20         Thread t3=new Thread(mt);
21         t1.start();
22         t2.start();
23         t3.start();
24     }
25 }

运行结果

Thread-0 卖票:ticket10
Thread-2 卖票:ticket8
Thread-1 卖票:ticket9
Thread-2 卖票:ticket6
Thread-0 卖票:ticket7
Thread-2 卖票:ticket4
Thread-1 卖票:ticket5
Thread-2 卖票:ticket2
Thread-0 卖票:ticket3
Thread-1 卖票:ticket1

结果说明
(01) 和上面“MyThread继承于Thread”不同;这里的MyThread实现了Thread接口。
(02) 主线程main创建并启动3个子线程,而且这3个子线程都是基于“mt这个Runnable对象”而创建的。运行结果是这3个子线程一共卖出了10张票。这说明它们是共享了MyThread接口的。

综合上面的,thread买了30张票,而runnable只卖了10张,所以说 runnable实现了资源共享

推荐用runnable来实现多线程

转自:http://www.cnblogs.com/skywang12345/p/3479063.html

原文地址:https://www.cnblogs.com/zmblog/p/8668361.html

时间: 2024-11-05 13:40:00

线程的两种实现方式的相关文章

Java---11---多线程的两种创建方式

多线程的两种创建方式: 下面这些东西是API文档中的: public class Thread extends Object implements Runnable 线程 是程序中的执行线程.Java 虚拟机允许应用程序并发地运行多个执行线程. 每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程.每个线程都可以或不可以标记为一个守护程序.当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护

线程概述以及线程的两种创建方式

package countThread; public class CountThread extends Thread{ private String name; public CountThread(String name) { super(name); } /** * 线程的执行体 * * 创建新执行线程有两种方法,一种方法是将类声明为Thread的子类,该子类应该重写Thread类中的run方法 * 接下来可以分配并且启动该子类的实例 */ @Override public void r

Java基础之线程的两种实现方式

进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程!线程总是属于某个线程,进程中的线程共享进程的内存 注意:对Java来说,run()方法没有任何特别之处.像main()方法一样,它只是新线程知道调用的方法名称(和签名).因此,在Runnable上或者Thread上调用run方法是合法的.但并不启动新的线程,启动新的线程要调用start()方法 在Java中提供了两种方式实现线程:1.继承Thread类 package unit_fifteen; p

java多线程总结一:线程的两种创建方式及优劣比较

1.通过实现Runnable接口线程创建 (1).定义一个类实现Runnable接口,重写接口中的run()方法.在run()方法中加入具体的任务代码或处理逻辑. (2).创建Runnable接口实现类的对象. (3).创建一个Thread类的对象,需要封装前面Runnable接口实现类的对象.(接口可以实现多继承) (4).调用Thread对象的start()方法,启动线程 示例代码: [java] view plaincopy <span style="font-size:16px;&

Java学习(九):Java线程的两种实现方式

线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位.在单个程序中同时运行多个线程完成不同的工作,称为多线程. 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础. Java线程创建的两种方式: 1.继承Thread类 public class MyThread extends Thread { private String name;

java多线程总结一:线程的两种创建方式及比较

1.线程的概念:线程(thread)是指一个任务从头至尾的执行流,线程提供一个运行任务的机制,对于java而言,一个程序中可以并发的执行多个线程,这些线程可以在多处理器系统上同时运行.当程序作为一个应用程序运行时,java解释器为main()方法启动一个线程. 2.并行与并发: (1)并发:在单处理器系统中,多个线程共享CPU时间,而操作系统负责调度及分配资源给它们. (2)并行:在多处理器系统中,多个处理器可以同时运行多个线程,这些线程在同一时间可以同时运行,而不同于并发,只能多个线程共享CP

Thread -线程的两种创建方式

package cn.learn.thread.Thread; /* 实现Runnable必须重写run()方法,一般推荐用Runnable实现 */ public class RunnableImpl implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName()+"执行"); } } package cn.learn.thread.Thre

java中线程的两种创建方式

第一种:继承java.lang.Thread类.然后重写run方法 例如我们模拟一个龟兔赛跑 1 package edu.aeon.thread; 2 3 /** 4 * 说明:模拟龟兔赛跑 5 * 6 * @author lzj 7 * 8 */ 9 public class RabbitThread extends Thread { 10 @Override 11 public void run() { 12 for (int i = 1; i <= 100; i++) { 13 Syste

1-多线程的两种实现方式

package org.ks.多线程; /* * 多线程(多线程程序实现的方式1)(掌握) * 1.继承Thread * 定义类继承Thread * 重写run方法 * 把新线程要做的事写在run方法中 * 创建线程对象 * 开启新线程, 内部会自动执行run方法 */ //现象: bb和ksdsb交替执行 public class Demo2_Thread_realize { public static void main(String[] args) { //方式一 /* MyThread