Thread:

  1. class MyThread extends Thread
  2. {
  3. private int ticketsCont=5; //一共有5张火车票
  4.  
  5. private String name; //窗口, 也即是线程的名字
  6.  
  7. public MyThread(String name){
  8. this.name=name;
  9. }
  10.  
  11. @Override
  12. public void run(){
  13.  
  14. while(ticketsCont>0){
  15. ticketsCont--; //如果还有票,就卖掉一张票
  16. System.out.println(name+"卖掉了1张票,剩余票数为:"+ticketsCont);
  17. }
  18.  
  19. }
  20. }
  21.  
  22. public class TicketsThread
  23. {
  24. public static void main(String args[]){
  25.  
  26. //创建三个线程,模拟三个窗口卖票
  27. MyThread mt1=new MyThread("窗口1");
  28. MyThread mt2=new MyThread("窗口2");
  29. MyThread mt3=new MyThread("窗口3");
  30.  
  31. //启动三个线程,也即是窗口,开始卖票
  32. mt1.start();
  33. mt2.start();
  34. mt3.start();
  35.  
  36. }
  37. }
  1. 窗口1卖掉了1张票,剩余票数为:4
  2. 窗口1卖掉了1张票,剩余票数为:3
  3. 窗口1卖掉了1张票,剩余票数为:2
  4. 窗口1卖掉了1张票,剩余票数为:1
  5. 窗口1卖掉了1张票,剩余票数为:0
  6. 窗口3卖掉了1张票,剩余票数为:4
  7. 窗口2卖掉了1张票,剩余票数为:4
  8. 窗口3卖掉了1张票,剩余票数为:3
  9. 窗口3卖掉了1张票,剩余票数为:2
  10. 窗口3卖掉了1张票,剩余票数为:1
  11. 窗口3卖掉了1张票,剩余票数为:0
  12. 窗口2卖掉了1张票,剩余票数为:3
  13. 窗口2卖掉了1张票,剩余票数为:2
  14. 窗口2卖掉了1张票,剩余票数为:1
  15. 窗口2卖掉了1张票,剩余票数为:0

Runnable接口:

  1. class MyThread2 implements Runnable
  2. {
  3. private int ticketsCont=5; //一共有5张火车票
  4.  
  5. @Override
  6. public void run(){
  7. while(true){
  8. synchronized(this){
  9. if(ticketsCont<=0){
  10. break;
  11. }
  12. ticketsCont--; //如果还有票,就卖掉一张票
  13.  
  14. System.out.println(Thread.currentThread().getName()+"卖掉了1张票,剩余票数为:"+ticketsCont);
  15.  
  16. /*try{
  17. Thread.sleep(50); //通过阻塞程序来查看效果
  18. }
  19. catch(Exception e){
  20. System.out.println(e);
  21. }*/
  22. }
  23. }
  24.  
  25. }
  26. }
  27.  
  28. public class TicketsRunnable
  29. {
  30. public static void main(String args[]){
  31.  
  32. MyThread2 mt=new MyThread2();
  33. //创建三个线程来模拟三个售票窗口
  34. Thread th1=new Thread(mt,"窗口1");
  35. Thread th2=new Thread(mt,"窗口2");
  36. Thread th3=new Thread(mt,"窗口3");
  37.  
  38. //启动三个线程,也即是三个窗口,开始卖票
  39. th1.start();
  40. th2.start();
  41. th3.start();
  42. }
  43. }
  1. 窗口1卖掉了1张票,剩余票数为:4
  2. 窗口1卖掉了1张票,剩余票数为:3
  3. 窗口1卖掉了1张票,剩余票数为:2
  4. 窗口1卖掉了1张票,剩余票数为:1
  5. 窗口1卖掉了1张票,剩余票数为:0

修改MyThread2

  1. class MyThread2 implements Runnable
  2. {
  3. private int ticketsCont=5; //一共有5张火车票
  4. @Override
  5. public void run() {
  6. while (true) {
  7. if (ticketsCont <= 0) {
  8. break;
  9. }
  10. ticketsCont--; //如果还有票,就卖掉一张票
  11. System.out.println(Thread.currentThread().getName() + "卖掉了1张票,剩余票数为:" + ticketsCont);
  12. }
  13. }
  14. }
  1. 窗口1卖掉了1张票,剩余票数为:3
  2. 窗口3卖掉了1张票,剩余票数为:2
  3. 窗口2卖掉了1张票,剩余票数为:3
  4. 窗口3卖掉了1张票,剩余票数为:0
  5. 窗口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. Java常用类之Properties类

    1.特性 Properties类表示了一个持久的属性集,可保存在流中或从流中加载,实现内存和文件的交互.Properties继承了Hashtable<Object,Object>类,可以使 ...

  2. Nvidia VertexTextureFetch Water

    http://http.download.nvidia.com/developer/SDK/Individual_Samples/samples.html http://http.download.n ...

  3. PHP 错误与异常 笔记与总结(1)错误(Deprecated,Notice,Warning)

    [常见的错误类型] ① 语法错误 [例1]程序语句结尾少了';' <?php $username = "dee" //少了分号; echo $username; 输出: ( ...

  4. PHP date函数参数详解

    PHP date函数参数详解 作者: 字体:[增加 减小] 类型:转载       time()在PHP中是得到一个数字,这个数字表示从1970-01-01到现在共走了多少秒,很奇怪吧 不过这样方便计 ...

  5. LR调用动态链接库DLL

    什么是动态库? 动态库一般又叫动态链接库(DLL),是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库. 动态链接提供了一种方法 ,使进程可以 ...

  6. Thwarting Buffer Overflow Attacks Stack Randomization

    Computer Systems A Programmer's Perspective Second Edition address-space layout randomization

  7. attr-img-src

    https://dev.w3.org/html5/spec-preview/the-img-element.html#attr-img-src The src attribute must be pr ...

  8. Delphi 如何操作外部程序的控件(如按钮,文本框,单选按钮等)

    看你要做什么,比较现在网络很流行的QQ.MSN这些软件都屏蔽了,你可能还可以访问一些小软件的这些控制,思路及方案如下(API函数自己去百度查一下)1.得到你要这个窗口的句柄 使用FindWindow2 ...

  9. 验证进入AppStore的评分界面

    NSString * appstoreUrlString = @"itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/view ...

  10. pro7

    1.本次课学习到的知识点: 函数的作用 确定函数的功能 定义函数 调用函数 2.实验过程中遇到的问题及解决方法: 定义函数时 变量的定义会出现混乱 通过看例题 多练习 逐渐熟悉 需从数学角度解决问题时 ...