多线程——达到Runnable介面
部分博客(多线程——继承Thread类)介绍了java多线程的第一种实现方法——继承Thread类。这篇博客介绍另外一种方法——实现Runnable接口,并实现run方法。
还用上篇博客的样例。如今用另外一种方法实现。详细代码例如以下:
public class Test2 implements Runnable{ private String word; public Test2(String word){
this.word = word;
} @Override
public void run() {
System.out.println(Thread.currentThread().getName() + ": 開始运行!" );
try {
//如果处理须要2秒
Thread.currentThread().sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ": 正在处理!" );
System.out.println(Thread.currentThread().getName() + ": " + word + "长度为:" + word.length());
} public static void main(String [] args ) {
String [] words = {"first","second","world","thread"};
for(String word : words){
Test2 test = new Test2(word);
Thread thread = new Thread(test);
thread.start();
}
}
}
运行结果例如以下:
Thread-0: 開始运行!
Thread-3: 開始运行!
Thread-2: 開始运行!
Thread-1: 開始运行!
Thread-1: 正在处理。
Thread-1: second长度为:6
Thread-3: 正在处理!
Thread-3: thread长度为:6
Thread-2: 正在处理。
Thread-2: world长度为:5
Thread-0: 正在处理!
Thread-0: first长度为:5
我们看到,使用Runnable,相同实现了功能。事实上。凡是能用继承Thread实现的,统统能够使用Runnable来实现。
由于Thread类相同实现了Runnable接口。我们使用继承Thread类来实现多线程仅仅是Runnable的一个特例。
上篇博客我们还提到了继承Thread类无法实现资源共享,而Runnable能够,那么,如今就让我们看看怎样使用Runnable来实现资源共享。
换一个样例,如果火车站分三个窗体卖票,共卖100张票。
让我们用Runnable来实现一个这个样例。详细代码例如以下:
public class Test3 implements Runnable{
private Integer ticket = 100;
public void run() {
System.out.println(Thread.currentThread().getName() + ": 開始卖票!" );
while(ticket > 0){
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":卖掉 " + ticket-- + " 号票 ");
}
}
public static void main(String [] args ) {
Test3 test = new Test3();
Thread t1=new Thread(test,"1号窗体");
Thread t2=new Thread(test,"2号窗体");
Thread t3=new Thread(test,"3号窗体");
t1.start();
t2.start();
t3.start();
}
}
运行结果例如以下:
1号窗体: 開始卖票!
2号窗体: 開始卖票! 3号窗体: 開始卖票。
2号窗体:卖掉 100 号票
1号窗体:卖掉 99 号票
3号窗体:卖掉 98 号票
2号窗体:卖掉 97 号票
1号窗体:卖掉 96 号票
3号窗体:卖掉 95 号票
2号窗体:卖掉 94 号票
1号窗体:卖掉 93 号票
3号窗体:卖掉 92 号票
2号窗体:卖掉 91 号票 ………………………… ………………………… 1号窗体:卖掉 10 号票
2号窗体:卖掉 9 号票
3号窗体:卖掉 8 号票
1号窗体:卖掉 7 号票
2号窗体:卖掉 6 号票
3号窗体:卖掉 5 号票
1号窗体:卖掉 4 号票
2号窗体:卖掉 3 号票
3号窗体:卖掉 2 号票
1号窗体:卖掉 1 号票
2号窗体:卖掉 0 号票
3号窗体:卖掉 -1 号票
从结果上来看。确实实现了资源共享,三个窗体确实操作的都是那100张票。但细致一看,结果还是有问题的。问题例如以下:
1号窗体:卖掉 1 号票
2号窗体:卖掉 0 号票
3号窗体:卖掉 -1 号票
我们运行的是while(ticket > 0)代码,怎么还会出现0、-1 呢?
这就是数据同步的问题。
事实上,凡是涉及到资源共享的,数据同步是必需要考虑的。
本篇博客重点说明资源能够共享,至于线程安全的问题。有兴趣的朋友能够继续完好。
使用Runnable实现多线程就讲到这里。下篇博客继续介绍第三种实现多线程的方法——实现Callable接口。
版权声明:本文博主原创文章,博客,未经同意不得转载。
多线程——达到Runnable介面的更多相关文章
- android 多线程Thread,Runnable,Handler,AsyncTask
先看两个链接: 1.http://www.2cto.com/kf/201404/290494.html 2. 链接1: android 的多线程实际上就是java的多线程.android的UI线程又称 ...
- java 多线程--- Thread Runnable Executors
java 实现多线程的整理: Thread实现多线程的两种方式: (1)继承 Thread类,同时重载 run 方法: class PrimeThread extends Thread { long ...
- Runnable,Thread实现多线程以及Runnable的同步资源共享
(一) 实现多线程有两种方式 (1) 继承Thread类,重写run()方法,如以下例子 class MyThread extends Thread{ public void run(){ // } ...
- [java多线程] - Thread&Runnable运用
负载是一个很大的话题,也是一个非常重要的话题.不管是在大的互联网软件中,还是在一般的小型软件,都对负载有一定的要求,负载过高会导致服务器压力过大:负载过低又比较浪费服务器资源,而且当高请求的时候还可能 ...
- 多线程之 Runnable接口
一.多线程实现的第二种方式 1.定义类,实现Runnable接口 2.重写接口中的run方法,要在run方法中定义线程要执行的任务 public class MyRunnableImpl implem ...
- 多线程——实现Runnable接口实现一个多线程
实现Runnable接口实现一个多线程 Runnable接口源码: package java.lang; //Runnable接口源码只有一个run方法 public interface Runnab ...
- java多线程--实现Runnable接口方式
因为java类只能继承一个类可以实现多个接口的特性,所以一般情况下不推荐使用继承Thread类实现多线程,下面是实现Runnable接口方式的简单多线程代码 package text; /** * 多 ...
- 多线程中Runnable 和Thread关于synchronized的疑点
学java时和同学碰到的一道题: 转自https://blog.csdn.net/qq_40857349/article/details/102809100 某公司组织年会,会议入场时有两个入口,在入 ...
- 第39天学习打卡(多线程 Thread Runnable 初始并发问题 Callable )
多线程详解 01线程简介 Process与Thread 程序:是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念. 进程则是执行程序的一次执行过程,它是一个动态的概念.是系统资源分配的 ...
随机推荐
- SQL基础检测
1.SQL 指的是? Structured Query Language 2.哪个 SQL 语句用于从数据库中提取数据? SELECT 3.哪条 SQL 语句用于更新数据库中的数据? UPDATE 4 ...
- Appium 出现 > error: com.test/.activity1 never started. Current: com.test/.activity2
在apium 运行的时候,会出现提示 activity 没有启动,当前是 activity 出现原因: 出现这种情况是因为 launch activity 再启动 app 之后 无法找到,变成了app ...
- Ubuntu通过源代码编译安装Octave 4.0
本教程/笔记,意在指导在Ubuntu及其它Linux系统上怎样通过源代码安装Octave. Octave简单介绍 Octave是GNU旗下取代matlab的数学工具软件,语法与matlab高度兼容.而 ...
- 在使用supervisord 管理tomcat时遇到的小问题
使用 supervisord 监控管理的进程必须以 nodaemon 启动,而 tomcat 的 startup.sh 脚本是daemon方式的,假设不做改动的话,supervisord 会一直报错 ...
- JSP的include指令
JSP的include 指令:向当前页面中插入的一个静态文件的内容. 在test5.jsp里面 <%@ include file="test5_1.jsp" %> 新建 ...
- 编写自己的单点登录(SSO)服务
王昱 yuwang881@gmail.com 博客地址http://yuwang881.blog.sohu.com 摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统其中.本文从 ...
- Delphi xe7并行编程快速入门(三篇)
现在多数设备.计算机都有多个CPU单元,即使是手机也是多核的.但要在开发中使用多核的优势,却需要一些技巧,花费时间编写额外的代码.好了,现在可以使用Delphi做并行编程了. 在Delphi.C++ ...
- Delphi的组件读写机制
Delphi的组件读写机制(一) 一.流式对象(Stream)和读写对象(Filer)的介绍在面向对象程序设计中,对象式数据管理占有很重要的地位.在Delphi中,对对象式数据管理的支持方式是其一大特 ...
- java OOP及相关基础知识汇总(转)
OOP 对象有三个要素 behavior 接口是怎样的,有什么方法/field可以用? state 调用方法的时候,对象会有什么反应? 只有通过调用方法才能改变一个对象的state identity ...
- CodeForces 13E. Holes 分块处理
正解是动态树,太难了,仅仅好分块处理水之.看了看status大概慢了一倍之多.. 分块算法大体就是在找一个折衷点,使得查询和改动的时间复杂度都不算太高,均为o(sqrt(n)),所以总的时间复 ...