Java多线程之 Thread VS Runnable 【带案例】

为此,我们举个例子,假设有火车站三个窗口,在卖火车票,总共只有5张票。每一个线程相当于一个窗口,分别售票

<strong>package com.thread;

class myThread extends Thread{

	private int ticketsCount=5;//一种有5张票
	private String name;//窗口,也即是线程的名字

	public myThread(String name){
		this.name=name;
	}

	@Override
	public void run() {
		while(ticketsCount>0) {
			//ticketsCount--;//如果还有票,就卖掉一张
			System.out.println(name+"有"+ticketsCount+"张票,卖了1一张票,剩余票数为:"+ --ticketsCount);
			//System.out.println(name+"卖了1一张票,剩余票数为:"+ticketsCount);
		}
	}

}
public class TicketsTread {

		public static void main(String args[]) {
			//创建三个线程,模拟三个窗口卖票
			myThread t1=new myThread("窗口1");
			myThread t2=new myThread("窗口2");
			myThread t3=new myThread("窗口3");

			//启动这三个线程,也即是窗口开始卖票
			t1.start();
			t2.start();
			t3.start();
		}
}

</strong>

输出为:

这样的结果说明了,每个窗口(线程)都卖了5张票,这是因为创建了3个Thread对象,每个对象有自己的成员实例变量。

因为每个线程,mt1,mt2,mt3分别是一个继承了Thread类的一个对象,所以对象拥有其所属类的私有或共有的成员变量或者成员方法,也就是说他们的变量,也即是票数ticketCount都是每个对象“自己”私有的,“各自为营”,资源并不是共享的。 那么,你就会看到,每个窗口都有5张票的情况咯。。

再使用runnable 来实现这个示例。

package com.thread;

class myThread_Runnable implements Runnable{
	private int ticketsCount=5;//一种有5张票

	public void run() {//如果给run方法加锁,那么会出现一个窗口会卖光所有票的现象
		while(ticketsCount>0) {
			ticketsCount--;//如果还有票,就卖掉一张
			System.out.println(Thread.currentThread().getName()+"卖了1一张票,剩余票数为:"+ticketsCount);
		}
	}

}

public class TicketsRunnable {

		public static void main(String args[]){
			myThread_Runnable mt=new myThread_Runnable();
			//创建三个线程,来模拟三个售票窗口
			Thread t1=new Thread(mt,"窗口1");
			Thread t2=new Thread(mt,"窗口2");
			Thread t3=new Thread(mt,"窗口3");

			//启动这三个线程,也即是三个窗口,开始卖票
			t1.start();
			t2.start();
			t3.start();
		}
}

上面这个是一个及其特殊的情况,线程(窗口)1一次性的使用了CPU并执行完了了run方法的所有代码,然后进程结束。

下面这个是一般性的结果:

上面这个输出就可以看出来,线程资源抢夺所导致的交叉执行。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 22:23:18

Java多线程之 Thread VS Runnable 【带案例】的相关文章

Java 多线程(1)-Thread和Runnable

一提到Java多线程,首先想到的是Thread继承和Runnable的接口实现 Thread继承 public class MyThread extends Thread { public void run(){ int i = 0; System.out.println("--------------"+i++); } } Runnable接口实现 public class RunnableImpl implements Runnable { private long value =

java多线程编程中实现Runnable接口方法相对于继承Thread方法的优势

 java多线程创建方法http://blog.csdn.net/cjc211322/article/details/24999163  java创建多线程方法之间的区别http://blog.csdn.net/cjc211322/article/details/25000449 java多线程编程中实现Runnable接口方法相对于继承Thread方法的优势

Java多线程extends Thread和implements Runnable

大家都知道,要实现Java多线程的两种方式 a:是直接继承Thread类,b:是实现Runnable接口. 先上代码: a:是直接继承Thread类, public class ThreadDemo1 extends Thread {    public void run(){        //Thread.currentThread().getName() 和 this.getName()都可以用来获得线程的名称        System.out.println("线程的名称:"

Java多线程01(Thread类、线程创建、线程池)

Java多线程(Thread类.线程创建.线程池) 第一章 多线程 1.1 多线程介绍 1.1.1 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程.一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序. 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 1.1.2 单线程程序 - 从入口m

并发编程之多线程基础-Thread和Runnable的区别及联系(二)

上篇文章讲述了创建线程的常用方式 本篇主要分析一下Thread和Runnable两种方式创建线程的区别及联系 联系: ?Thread类实现了Runable接口. ?都需要重写里面Run方法. 区别: ?Thread方式不支持多继承,Runnable方式支持多个实现 ?Runnable更容易实现资源共享,能多个线程同时处理一个资源. 疑惑分享: 本人在理解他们区别的时候 考虑到Thread类本身就是Runnable的实现类 所以产生了一个疑惑:- 为什么Runnable可以实现共享而Thread却

java多线程创建-Thread,Runnable,callable和threadpool

java创建多线程的方式有许多种,这里简要做个梳理 1. 继承Thread类 继承java.lang.Thread类,创建本地多线程的类,重载run()方法,调用Thread的方法启动线程.示例代码如下: MyThread.java public class MyThread extends Thread { public void run(){ private int copy = 0; System.out.println("Thread id:" + Thread.current

Java 多线程之 Thread 类 和 Runnable 接口初步使用

Thread 类 Thread 类是在 JDK1.0 时就存在的, 在 Java 中接触的多线程开发基本上都会从这个类开始. Thread之定义线程类 使用 Thread 创建线程的方法很简单, Thread 是一个类, 在需要创建线程时, 我们只需要继承这个类, 并将 run() 方法进行重写即可. class PrimeThread extends Thread { long minPrime; PrimeThread(long minPrime) { this.minPrime = min

java 多线程 继承Thread和实现Runnable的区别

1)继承Thread: public class ThreadTest extends Thread { private int count; private String name; public ThreadTest(int count,String name){ this.count = count; this.name = name; } public void run() { while(count>0) { System.out.println(name+"买票 "+

多线程(Thread、Runnable、Callable)

1.继承Thread类,重写run方法 线程 是程序中的执行线程.Java 虚拟机允许应用程序并发地运行多个执行线程. 每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程.每个线程都可以或不可以标记为一个守护程序.当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序. 2.实现Runnable接口,实现run()方法 Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现