开启线程的Thread与Runnable

1、线程介绍

进程(process)是指在系统中正在运行的一个应用程序,是系统资源分配的基本单位,在内存中有其完备的数据空间和代码空间,拥有完整的虚拟空间地址。一个进程所拥有的数据和变量只属于它自己。

线程(thread)是进程内相对独立的可执行单元,所以也被称为轻量进程(lightweight processes);是操作系统进行任务调度的基本单元。它与父进程的其它线程共享该进程所拥有的全部代码空间和全局变量,但拥有独立的堆栈(即局部变量对于线程来说是私有的)。

当一个程序开始运行时,它就是一个进程,进程包含运行中的程序和程序所使用的内存和系统资源。而一个进程又是由多个线程组成的。引入线程优点是易于调度,提供开发效率,通过线程可以方便有效的实现并发,进程可创建多个线程来执行同一个程序的不同部分,开销小,创建线程比创建进程要快,所需开销很少。

2、Runable和Thread的关系

在java中可有两种方法实现多线程,一种是继承Thread类,一种是实现Runnable接口;

2.1 继承Thread类

class TestThread extends Thread{
    private String name;
    public TestThread(String name) {
	super();
	this.name = name;
    }
    public void run() {
	for(int i = 0;i < 10;i++) {
		System.out.println("线程信息:"+this.name+",i="+i);
	}
    }
}

测试案例:

public class ThreadDemo {
	public static void main(String[] args) {
		TestThread tt1 = new TestThread("这里是张三");
		TestThread tt2 = new TestThread("这里是李四");
		tt.start();
		tt.start();
	}
}

2.2 实现Runnable接口

代码如下:

public class TestThread implements Runnable{
	private String name;
    	public TestThread(String name) {
		super();
		this.name = name;
    	}
    	public void run() {
		for(int i = 0;i < 10;i++) {
			System.out.println("线程信息:" + this.name + ",i = " +i);
		}
    	}
}

然而在Runnable的子类中没有start() 方法,只有Thread类中才有 。此时视察Thread类,有一个构造函数:public Thread(Runnable targer) 此构造函数接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现多线程 。(start() 可以协调系统的资源):

public class ThreadDemo {
	public static void main(String[] args) {
		TestThread tt1 = new TestThread("这里是张三");
		TestThread tt2 = new TestThread("这里是李四");
		new Thread(tt1).start();
		new Thread(tt2).start();
	}
}

3、实际中如何应用这两种实现模式

在程序实现多线程应优先以实现Runnable接口为主,由于实现Runnable接口相比继承Thread类有如下好处:

(1)避免点继承的局限,一个类可以继承多个接口 。

(2)利于资源的共享。

以卖票程序为例,通过Thread类实现:

class TicketThread extends Thread {
	private int ticket = 1000;
	public void run(){
		for(int i = 0;i < 1000;i++) {
			if(this.ticket > 0){
				System.out.println("卖票:ticket"+this.ticket--);
			}
		}
	}
}

下面通过三个线程对象,同时卖票:

public class ThreadTicket {

	/**
	 * 继承Thread
	 */
	public static void startThread(){
		TicketThread tt1 = new TicketThread();
		TicketThread tt2 = new TicketThread();
		TicketThread tt3 = new TicketThread();
		tt1.start();//每个线程都各卖了1000张,共卖了3000张票
		tt2.start();
		tt3.start();
	}

	/**
	 * 实现Runable接口
	 */
	public static void startRunable(){
		TicketThread tt = new TicketThread();
		new Thread(tt).start();//同一个mt
		new Thread(tt).start();
		new Thread(tt).start();
	}

	public static void main(String[] args) {
		startThread();
		startRunable();
	}
}

现在程序中有三个线程,然而一共卖了10张票,也就是说使用Runnable实现多线程可以达到资源共享的目的。

4、Runnable接口和Thread的关系总结

(1) 说白了就是类和接口的区别。Thread是一个类,java中是不允许继承多个父类的,这就是Thread的一个局限性。而使用Runnable就不同了,可以implements多个接口,同时继承一个父类,这样会更加灵活。

(2) 当多个线程需要共享资源时,用Thread很难达到目的,但是用Runnable接口就容易许多了。

(3) 二者的联系:看源码可以发现,Thread其实就是继承了Runnable接口的子类。

时间: 2024-10-20 09:59:56

开启线程的Thread与Runnable的相关文章

2018-08-25多线程Thread类+Runnable接口+线程的6种状态

多线程: 进程:进程指正在运行的程序:确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能(进入内存运行的程序成为进程)! 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程!一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序(线程是执行单元,一个进程可以包括多个线程,一个程序可以有多个进程)! 单线程程序:若有多个任务只能依次执行(这个任务执行完毕,下一个任务开始执行)!如:去网吧上网,网吧只能让一

Java并发编程之线程创建和启动(Thread、Runnable、Callable和Future)

这一系列的文章暂不涉及Java多线程开发中的底层原理以及JMM.JVM部分的解析(将另文总结),主要关注实际编码中Java并发编程的核心知识点和应知应会部分. 说在前面,Java并发编程的实质,是线程对象调用start方法启动多线程,而线程对象则必须是Thread类或其子类实现.Runnable和Callable的作用类似于Comparable.Serializable,是用于被并发的类实现的接口,从而使得Thread类可以在初始化时传入这个被并发的类.此是大前提.本文从多线程实现和启动出发,对

JAVA线程应用Thread:创建线程的第二种方式:实现Runnable接口

/* 需求:卖票小程序! 思路:实现多个窗口(线程)同时售票. 步骤:1,定义类实现Runnable接口. 2,覆盖Runnable接口中的run方法. 3,通过Thread类创建线程对象. 4,将Runnable接口的子类对象作为实际参数传入Thread类的构造函数当中. 5,调用Thread类的start方法开启线程并调用Runnabke接口的run方法. */ 代码如下 class Ticket implements Runnable//extends Thread//实现Runnable

java线程-Thread和Runnable的区别

进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程. 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小. 线程和进程一样分为五个阶段:创建.就绪.运行.阻塞.终止. 多进程是指操作系统能同时运行多个任务(程序). 多线程是指在同一程序中有多个顺序流在执行 在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口. Thread类是在java.lang包

几种创建线程方式Thread类和Runnable接口

对于很多想学习java的人来说,经常听别人说线程难,其实真正理解了线程后,一点都不会觉得线程难,这里我为大家梳理下线程的创建方式吧. 一.线程的创建方式有三种 1.继承Thread类 2.实现Runnable接口 3.实现Callable接口(返回结果并且可能抛出异常的任务). 如果采用实现Callable接口接口的方式,返回结果并且可能抛出异常的任务,不利于开发,这里就不给大家介绍了.这里咋们主要说说采用继承Thread类和实现Runnable接口的方式来创建线程. 1.继承Thread类的方

创建线程的两种方式比较Thread VS Runnable

1.首先来说说创建线程的两种方式 一种方式是继承Thread类,并重写run()方法 1 public class MyThread extends Thread{ 2 @Override 3 public void run() { 4 // TODO Auto-generated method stub 5 6 } 7 } 8 //线程使用 9 MyThread mt = new MyThread(); //创建线程 10 mt.start(); //启动线程 另外一种方式是实现Runnabl

java: Thread 和 runnable线程类

Java有2种实现线程的方法:Thread类,Runnable接口.(其实Thread本身就是Runnable的子类) Thread类,默认有run(), start()方法,继承Thread类,需要实现run方法 Thread多线程,不能共享资源,保证数据的的统一(以商城商品数量,售票系统票的数量为例) 例如: public class MyThread extends Thread { private String name; // 定义name属性 public MyThread(Stri

002-多线程实现方式【thread、runnable、callale、thread和runnable对比】

一.概述 1.实现方式 在java中对于多线程实现一定要有一个线程的主类,而这个线程的主类往往是需要操作一些资源,但是对于多线程主类的实现是: 继承Thread父类 从java的Thread类继承实现多线程,也是实现其run方法,然后声明实例,并调用实例的start方法启动线程. 实现Runnable接口(Callable接口) 使用Runnable接口实现多线程需要两个步骤,首先实现Runnable接口类,然后声明Thread实例,调用thread实例的start方法,开始执行. 2.java

Android学习笔记(三一):线程:Message和Runnable

程序需要相应用户的操作,最要能在200ms(0.2s)之内,如果超过5秒没有反应,ActivityManager会没有提示就kill了activity.然而,activity可能真的需要时间来进行处理,这往往会用到后台线程-background thread.后台线程可以安全地和UI线程进行交互,其中后台线程是不能修改UI的.我不太确切知晓“不能修改UI”到何种程度,例如在下面的例子进度条状态的修改是允许的,在复杂的例子中可能会出现问题,例如两个后台线程都要处理同一个widget,可能会有不可预