多线程基础

[b]为什么要使用多线程[/b]

多线程则指的是在单个程序中可以同时运行多个不同的线程,执行不同的任务。因为线程只能在单个进程的作用域内活动,所以创建线程比创建进程要廉价得多,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。因此多线程编程在现代软件设计中大量采用。
在程序设计时,如果要同时执行不同的任务在相同的时间段内,则要实现多线程,例如基于socket的聊天室的实现,在客户端,要监听服务端发来的信息的同时要将用户输入的文字即时的发送至服务器端,就要实现多线程来解决问题。
使 UI 响应更快
利用多处理器系统
简化建模
执行异步或后台处理
[b]java中如何创建多线程,如何启动线程[/b]

两种方式:
<1> 让一个类实现Runnable接口(实现该接口的run()方法)。

public void run(){

}


<2> 让一个类继承java.lang.Thread类,由于Thread类本身已经实现了Runnable接口,所以通过继承该类,仍然可以将一个普通的类转变为线程类。该类重写run方法,创建对象,调用其start方法。

[b]线程的状态[/b]

引用:[url]http://blog.csdn.net/anmei2010/archive/2009/05/04/4150052.aspx[/url]

初始状态、就绪状态、运行状态、堵塞状态、结束状态

1.初始化状态:当new语句创建的线程对象处于初始化状态,仅仅在被分配了内存。

2.就绪状态:当一个线程对象创建后,其他线程调用它的start()方法,该线程就进入就绪状态,JVM会为它创建方法调用栈和程序计数器。处于这个状态的线程位于可运行池中,等待获得CPU的使用权。

3.运行状态: 处于这个状态的线程占用CPU,执行程序代码。在并发运行环境中,如果计算机只有一个CPU,那么任何时刻只会有一个线程处于这个状态。如果计算机有多个CPU,那么同一时刻可以让几个线程占用不同的CPU,使它们都处于运行状态。只有就绪状态的线程才有机会转到运行状态。
阻塞状态

4. 阻塞状态:指线程因为某些原因放弃CPU,暂时停止运行。当线程处于阻塞状态时,JVM不会给线程分配CPU,直到线程重新进入就绪状态,它才有机会转到运行状态。
阻塞状态可分为以下3种
1))位于对象等等池中的阻塞状态:当线程牌运行状态时,如果执行了某个对象的wait()方法,JVM就会把线程放到这个对象的等待池中。

2))位于对象锁池中的阻塞状态:当线程牌运行状态,试图获得某个对象的同步锁时,如果该对象的同步锁已经被其他线程占用,JVM就会把这个线程放到这个对旬的锁池中。

3))其他阻塞状态:当前线程执行了sleep()方法,或者调用了其他线程的join()方法,或者发出了I/O请求时,就会进入这个状态。

当一个线程执行System.out.println()或者System.in.read()方法时,就会发出一个I/O请求,该线程放弃CPU,进入阻塞状态,直到I/O处理完毕,该线程才会恢复运行。
5.结束状态:当线程退出run()方法时,就进入结束状态,该线程结束生命周期。线程有可能是正常执行完run()方法而退出,也有可能是遇到异常而退出。不管线程正常结束还是异常结束,都不会对其他其他线程造成影响。

Thread类的isAlive()方法判断一个线程是否活着,当线程处于死亡状态或者新建状态时,该方法返回false,在其余状态下,该方法返回true.

[b]示例:随机数程序[/b]

public class Test3 {

//GUI
JFrame frame = new JFrame("计数器");
MyLabel lab = new MyLabel();
JButton startbtn = new JButton("start");
JButton stopbtn = new JButton("stop");
JPanel pan = new JPanel();
JPanel pantop = new JPanel();

public static void main(String[] args) {
//入口方法
Test3 t3 = new Test3();
t3.init();

}


public void init(){
//初始化方法 加监听器
startbtn.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent arg0) {
//新建线程,设置标志位为true
Thread t3 = new Thread(lab);
lab.setFlag(true);
//开始线程
t3.start();
}
}
);

stopbtn.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent arg0) {
//设置标志位为false,即停止线程
lab.setFlag(false);
}
});
pan.setLayout(new FlowLayout());
pantop.add(lab);
pan.add(startbtn);
pan.add(stopbtn);
frame.setLayout(new BorderLayout());
frame.add(pantop,"North");
frame.add(pan,"Center");
frame.setSize(300, 130);
frame.setVisible(true);


frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


}
}

class MyLabel extends JLabel implements Runnable{

private double value = 0;
private Boolean flag = true;

public void setValue(double value) {
this.value = value;
}

public void setFlag(Boolean flag) {
this.flag = flag;
}

public MyLabel() {
this.setText(String.valueOf(value));
}
public void run() {
//如果flag为true则开始,否则停止
while(flag){
value = Math.random();
this.setText(String.valueOf(value));
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值