Thread:

class MyThread extends Thread
{
private int ticketsCont=5; //一共有5张火车票 private String name; //窗口, 也即是线程的名字 public MyThread(String name){
this.name=name;
} @Override
public void run(){ while(ticketsCont>0){
ticketsCont--; //如果还有票,就卖掉一张票
System.out.println(name+"卖掉了1张票,剩余票数为:"+ticketsCont);
} }
} public class TicketsThread
{
public static void main(String args[]){ //创建三个线程,模拟三个窗口卖票
MyThread mt1=new MyThread("窗口1");
MyThread mt2=new MyThread("窗口2");
MyThread mt3=new MyThread("窗口3"); //启动三个线程,也即是窗口,开始卖票
mt1.start();
mt2.start();
mt3.start(); }
}
窗口1卖掉了1张票,剩余票数为:4
窗口1卖掉了1张票,剩余票数为:3
窗口1卖掉了1张票,剩余票数为:2
窗口1卖掉了1张票,剩余票数为:1
窗口1卖掉了1张票,剩余票数为:0
窗口3卖掉了1张票,剩余票数为:4
窗口2卖掉了1张票,剩余票数为:4
窗口3卖掉了1张票,剩余票数为:3
窗口3卖掉了1张票,剩余票数为:2
窗口3卖掉了1张票,剩余票数为:1
窗口3卖掉了1张票,剩余票数为:0
窗口2卖掉了1张票,剩余票数为:3
窗口2卖掉了1张票,剩余票数为:2
窗口2卖掉了1张票,剩余票数为:1
窗口2卖掉了1张票,剩余票数为:0

Runnable接口:

class MyThread2 implements Runnable
{
private int ticketsCont=5; //一共有5张火车票 @Override
public void run(){
while(true){
synchronized(this){
if(ticketsCont<=0){
break;
}
ticketsCont--; //如果还有票,就卖掉一张票 System.out.println(Thread.currentThread().getName()+"卖掉了1张票,剩余票数为:"+ticketsCont); /*try{
Thread.sleep(50); //通过阻塞程序来查看效果
}
catch(Exception e){
System.out.println(e);
}*/
}
} }
} public class TicketsRunnable
{
public static void main(String args[]){ MyThread2 mt=new MyThread2();
//创建三个线程来模拟三个售票窗口
Thread th1=new Thread(mt,"窗口1");
Thread th2=new Thread(mt,"窗口2");
Thread th3=new Thread(mt,"窗口3"); //启动三个线程,也即是三个窗口,开始卖票
th1.start();
th2.start();
th3.start();
}
}
窗口1卖掉了1张票,剩余票数为:4
窗口1卖掉了1张票,剩余票数为:3
窗口1卖掉了1张票,剩余票数为:2
窗口1卖掉了1张票,剩余票数为:1
窗口1卖掉了1张票,剩余票数为:0

修改MyThread2

class MyThread2 implements Runnable
{
private int ticketsCont=5; //一共有5张火车票
@Override
public void run() {
while (true) {
if (ticketsCont <= 0) {
break;
}
ticketsCont--; //如果还有票,就卖掉一张票
System.out.println(Thread.currentThread().getName() + "卖掉了1张票,剩余票数为:" + ticketsCont);
}
}
}
窗口1卖掉了1张票,剩余票数为:3
窗口3卖掉了1张票,剩余票数为:2
窗口2卖掉了1张票,剩余票数为:3
窗口3卖掉了1张票,剩余票数为:0
窗口1卖掉了1张票,剩余票数为:1

Thread类是多个线程分别完成自己的任务,Runnable是多个线程共同完成一个任务。

建议使用Runnable这种方式创建线程。 程序中的同一资源指的是同一个Runnable对象。安全的卖票程序中需要加入同步synchronized。

http://www.cnblogs.com/Li-Cheng/p/4332179.html

Java 多线程Thread和Runnable的更多相关文章

  1. JAVA多线程Thread VS Runnable详解

    要求 必备知识 本文要求基本了解JAVA编程知识. 开发环境 windows 7/EditPlus 演示地址 源文件   进程与线程 进程是程序在处理机中的一次运行.一个进程既包括其所要执行的指令,也 ...

  2. java 多线程Thread和Runnable的区别

    如果一个类继承Thread,则不适合资源共享.但是如果实现了Runable接口的话,则很容易的实现资源共享 实现Runnable接口比继承Thread类所具有的优势:1. 适合多个相同的程序代码的线程 ...

  3. JAVA多线程Thread与Runnable

    一.Runnable Runnable为一个之包含一个run方法的接口 public class MyRunnable implements Runnable{ @Override //表示:预示重写 ...

  4. Java 多线程实现接口Runnable和继承Thread区别(转)

    Java 多线程实现接口Runnable和继承Thread区别 Java中有两种实现多线程的方式.一是直接继承Thread类,二是实现Runnable接口.那么这两种实现多线程的方式在应用上有什么区别 ...

  5. java 多线程--- Thread Runnable Executors

    java 实现多线程的整理: Thread实现多线程的两种方式: (1)继承 Thread类,同时重载 run 方法: class PrimeThread extends Thread { long ...

  6. java:多线程基础之Runnable、Callable与Thread

    java.lang包下有二个非常有用的东西:Runnable接口与Thread类,Thread实现了Runnable接口(可以认为Thread是Runnable的子类),利用它们可以实现最基本的多线程 ...

  7. [java多线程] - Thread&Runnable运用

    负载是一个很大的话题,也是一个非常重要的话题.不管是在大的互联网软件中,还是在一般的小型软件,都对负载有一定的要求,负载过高会导致服务器压力过大:负载过低又比较浪费服务器资源,而且当高请求的时候还可能 ...

  8. java多线程(二)-Runnable和Thread

    Java在顺序性语言的基础上提供了多线程的支持.Java的线程机制是抢占式的.这表示调度机制会周期的中断线程,将上下文切换到另一个线程,从而为每个线程都提供时间片.(与抢占式多线程对应的是 协作式多线 ...

  9. 探Java多线程Thread类和Runnable接口之间的联系

    首先复习一下Java多线程实现机制,Java实现多线程方法有如下这么几种: 1.继承了(extends)Thread类 2.实现了(implements)Runnable接口 也就是说  有如下两种情 ...

随机推荐

  1. Nginx 笔记与总结(14)expires 缓存设置

    设置缓存,可以提高网站性能. 当网站的部分内容,比如新闻站的图片,一旦发布就不太可能发生更改,此时需要用户在访问一次页面之后,把该页面的图片缓存在用户的浏览器端一段时间,就可以用到 nginx 的 e ...

  2. 高手指南PHP安装配置

    高手指南PHP安装配置 2014-11-05 12:57:13   来源:   评论:0 次 点击:12 次 | 发布人:登陆查看   PHP的快速发展,它的功能越来越强大,运用它也变得很方便,下面我 ...

  3. typecho流程原理和插件机制浅析(第一弹)

    typecho流程原理和插件机制浅析(第一弹) 兜兜 393 2014年03月28日 发布 推荐 5 推荐 收藏 24 收藏,3.5k 浏览 虽然新版本0.9在多次跳票后终于发布了,在漫长的等待里始终 ...

  4. Ruby--Array

    --后面连接其它数组:[ARRAY].concat([OTHER ARRAY]) --排序:sort,进阶:sort_by{|obj| obj.[VALUE]} --随机获取:[ARRAY].samp ...

  5. Oracle Merge Into 用法详解

    原文:http://blog.csdn.net/EdgenHuang/article/details/3587912 Oracle9i引入了MERGE命令,你能够在一个SQL语句中对一个表同时执行in ...

  6. 大话数据结构(十一)java程序——串

    1.串的定义 串(String):是由零个或多个字符组成的有限序列,又名为字符串. 一般记为s="a1a2a3.........an"(n>=0),其中,s是串名称,用双引号 ...

  7. Introducing the Accelerated Mobile Pages Project, for a faster, open mobile web

    https://googleblog.blogspot.com/2015/10/introducing-accelerated-mobile-pages.html October 7, 2015 Sm ...

  8. 【转】C# 解析 json

    C# 解析 json JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集. JSON采用完全独立于语言的 ...

  9. [dpdk] 读官方文档(3)

    续前节, 测试小程序 1. 想编译测试程序首先需要设置两个环境变量,为什么呢,因为测试程序的Makefile里用了... rpm装了打包好的devel包,这个rpm也会自带这两个环境变量.就是说写第三 ...

  10. Inno Setup入门(十)——操作注册表 & 自启程序

    http://379910987.blog.163.com/blog/static/3352379720110259414788/ 有些程序需要随系统启动,或者需要建立某些文件关联等问题,这些都是通过 ...