多线程进程该选择哪一个
来源:互联网 发布:dos下运行java程序 编辑:程序博客网 时间:2024/04/29 06:58
上一篇我们提到到底该如何选择多线程使用哪一个?
我们通过一个例子来说明他们的不同:
Thread 代码如下:
package com.game.test;
public class TicketThread extends Thread{
private int ticketCount=5;
public void run(){
for(int i=0;i<7;i++){
if(this.ticketCount>0){
System.out.println("剩余的数量====>"+ticketCount--);
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//模拟3个线程取票
TicketThread t1=new TicketThread();
TicketThread t2=new TicketThread();
TicketThread t3=new TicketThread();
t1.start();
t2.start();
t3.start();
}
}
[输出结果]
剩余的数量====>5
剩余的数量====>4
剩余的数量====>3
剩余的数量====>2
剩余的数量====>1
剩余的数量====>5
剩余的数量====>4
剩余的数量====>5
剩余的数量====>4
剩余的数量====>3
剩余的数量====>3
剩余的数量====>2
剩余的数量====>1
剩余的数量====>2
剩余的数量====>1
如果这个是一个买票系统的话, 如果ticket是车票数量的话,说明并没有实现资源共享.
我们换为runnable 代码如下:
package com.game.test;
public class TicketRunnable implements Runnable{
private int ticket=5;
/**
* @param args
*/
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<20;i++){
if(this.ticket>0){
System.out.println("当前线程"+Thread.currentThread().getName()+"正在卖票"+ticket--);
}
}
}
public static void main(String[] args) {
TicketRunnable tr=new TicketRunnable();
new Thread(tr,"1号窗台").start();
new Thread(tr,"2号窗台").start();
new Thread(tr,"3号窗台").start();
}
}
当前线程2号窗台正在卖票4
当前线程2号窗台正在卖票2
当前线程2号窗台正在卖票1
当前线程3号窗台正在卖票3
当前线程1号窗台正在卖票5
总结一下吧:
实现Runnable接口比继承Thread类所具有的优势:
1):适合多个相同的程序代码的线程去处理同一个资源
2):可以避免java中的单继承的限制
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。
所以换是建议大家实现接口的方式操作线程.
另外如果没有指定线程的名字的话,系统会自动提供名字 例如:
package com.game.test;
public class GetThreadName implements Runnable{
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
GetThreadName gr=new GetThreadName();
new Thread(gr,"A").start();
new Thread(gr,"B").start();
new Thread(gr).start();
}
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<3;i++){
System.out.println(Thread.currentThread().getName());
}
}
}
[输出结果]
B
B
B
Thread-0
Thread-0
Thread-0
A
A
A
其实我们的main方法也是一个线程.在java中所有的线程都是同时启动的,至于什么时候,哪个先执行,完全看谁先得到系统的CPU资源.
在java中,我们每次程序运行至少启动2个线程.一个是main线程,一个是垃圾收集线程.
如何判断线程是否已经启动呢?
package com.game.test;
public class GetThreadName implements Runnable{
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
GetThreadName gr=new GetThreadName();
Thread t1=new Thread(gr);
System.out.println("线程启动之前========>"+t1.isAlive());
t1.start();
System.out.println("线程启动之后========>"+t1.isAlive());
}
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<3;i++){
System.out.println(Thread.currentThread().getName());
}
}
}
[结果如下]
线程启动之前========>false
线程启动之后========>true
Thread-0
Thread-0
Thread-0
今天就先介绍到这里,后面我们在探讨线程.
- 多线程进程该选择哪一个
- 我该选择哪一个
- 基础和技能该选择哪一个?
- 网页设计师和网页前端开发我该选择哪一个
- MySQL与PostgreSQL:该选择哪个开源数据库?哪一个更好?
- MySQL与PostgreSQL:该选择哪个开源数据库?哪一个更好?
- MySQL与PostgreSQL:该选择哪个开源数据库?哪一个更好?
- MySQL与PostgreSQL:该选择哪个开源数据库?哪一个更好?
- MySQL与PostgreSQL:该选择哪个开源数据库?哪一个更好?
- MySQL与PostgreSQL:该选择哪个开源数据库?哪一个更好?
- MySQL与PostgreSQL:该选择哪个开源数据库?哪一个更好?
- hadoop、Storm该选哪一个
- 多进程多线程的选择
- 多进程多线程的选择
- 多进程多线程的选择
- 多进程多线程的选择
- MSN,QQ你选择哪一个?
- 计算机四级该报哪一个?
- yongyuan
- sigar获取系统信息
- 安全控件文本的输入
- 进程终止
- BSP(Board Support Package 板级支持包)笔记
- 多线程进程该选择哪一个
- jointjs
- Apache中设置默认首页的方法
- 最简单的基于VC的日志文件类库实现
- 面试被鄙视了
- yongyuan
- 豆瓣的问题不是节奏慢,而是找不到自己的节奏,找不到自己的方向
- ASCII码表
- linux 设置环境变量