Java 多线程Thread和Runnable
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的更多相关文章
- JAVA多线程Thread VS Runnable详解
要求 必备知识 本文要求基本了解JAVA编程知识. 开发环境 windows 7/EditPlus 演示地址 源文件 进程与线程 进程是程序在处理机中的一次运行.一个进程既包括其所要执行的指令,也 ...
- java 多线程Thread和Runnable的区别
如果一个类继承Thread,则不适合资源共享.但是如果实现了Runable接口的话,则很容易的实现资源共享 实现Runnable接口比继承Thread类所具有的优势:1. 适合多个相同的程序代码的线程 ...
- JAVA多线程Thread与Runnable
一.Runnable Runnable为一个之包含一个run方法的接口 public class MyRunnable implements Runnable{ @Override //表示:预示重写 ...
- Java 多线程实现接口Runnable和继承Thread区别(转)
Java 多线程实现接口Runnable和继承Thread区别 Java中有两种实现多线程的方式.一是直接继承Thread类,二是实现Runnable接口.那么这两种实现多线程的方式在应用上有什么区别 ...
- java 多线程--- Thread Runnable Executors
java 实现多线程的整理: Thread实现多线程的两种方式: (1)继承 Thread类,同时重载 run 方法: class PrimeThread extends Thread { long ...
- java:多线程基础之Runnable、Callable与Thread
java.lang包下有二个非常有用的东西:Runnable接口与Thread类,Thread实现了Runnable接口(可以认为Thread是Runnable的子类),利用它们可以实现最基本的多线程 ...
- [java多线程] - Thread&Runnable运用
负载是一个很大的话题,也是一个非常重要的话题.不管是在大的互联网软件中,还是在一般的小型软件,都对负载有一定的要求,负载过高会导致服务器压力过大:负载过低又比较浪费服务器资源,而且当高请求的时候还可能 ...
- java多线程(二)-Runnable和Thread
Java在顺序性语言的基础上提供了多线程的支持.Java的线程机制是抢占式的.这表示调度机制会周期的中断线程,将上下文切换到另一个线程,从而为每个线程都提供时间片.(与抢占式多线程对应的是 协作式多线 ...
- 探Java多线程Thread类和Runnable接口之间的联系
首先复习一下Java多线程实现机制,Java实现多线程方法有如下这么几种: 1.继承了(extends)Thread类 2.实现了(implements)Runnable接口 也就是说 有如下两种情 ...
随机推荐
- Java常用类之Properties类
1.特性 Properties类表示了一个持久的属性集,可保存在流中或从流中加载,实现内存和文件的交互.Properties继承了Hashtable<Object,Object>类,可以使 ...
- Nvidia VertexTextureFetch Water
http://http.download.nvidia.com/developer/SDK/Individual_Samples/samples.html http://http.download.n ...
- PHP 错误与异常 笔记与总结(1)错误(Deprecated,Notice,Warning)
[常见的错误类型] ① 语法错误 [例1]程序语句结尾少了';' <?php $username = "dee" //少了分号; echo $username; 输出: ( ...
- PHP date函数参数详解
PHP date函数参数详解 作者: 字体:[增加 减小] 类型:转载 time()在PHP中是得到一个数字,这个数字表示从1970-01-01到现在共走了多少秒,很奇怪吧 不过这样方便计 ...
- LR调用动态链接库DLL
什么是动态库? 动态库一般又叫动态链接库(DLL),是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库. 动态链接提供了一种方法 ,使进程可以 ...
- Thwarting Buffer Overflow Attacks Stack Randomization
Computer Systems A Programmer's Perspective Second Edition address-space layout randomization
- attr-img-src
https://dev.w3.org/html5/spec-preview/the-img-element.html#attr-img-src The src attribute must be pr ...
- Delphi 如何操作外部程序的控件(如按钮,文本框,单选按钮等)
看你要做什么,比较现在网络很流行的QQ.MSN这些软件都屏蔽了,你可能还可以访问一些小软件的这些控制,思路及方案如下(API函数自己去百度查一下)1.得到你要这个窗口的句柄 使用FindWindow2 ...
- 验证进入AppStore的评分界面
NSString * appstoreUrlString = @"itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/view ...
- pro7
1.本次课学习到的知识点: 函数的作用 确定函数的功能 定义函数 调用函数 2.实验过程中遇到的问题及解决方法: 定义函数时 变量的定义会出现混乱 通过看例题 多练习 逐渐熟悉 需从数学角度解决问题时 ...