初识多线程

来源:互联网 发布:mac玲珑加速器装不进去 编辑:程序博客网 时间:2024/05/16 18:26
多线程的意义:在单线程中,程序代码按调用顺序依次往下执行,如果需要一个进程同时完成多段代码的操作,就需要产生多线程。

实现线程的两种方式
一:继承Thread类

public class ThreadTest extends Thread{}

完成线程功能的代码在run()中,当一个类继承Thread就可以重写它的run()方法,将实现该线程功能的代码写入run()中,然后调用Thread类的start()方法(通过start()去调用run()而不是直接调用)执行线程。

public static void main(String[] args){    new ThreadTest().start();}

如不调用start(),线程永远都不会启动,调用start()之前,Thread对象只是一个实例,而不是一个真正的线程。
如果strat()调用一个已经启动的线程,系统将抛出IllegalThreadStateException异常。

二:实现Runnable接口
如果要继承其他类(非Thread类),又要使用多线程,那么通过Runnable接口来实现。因为Java不支持多继承。

public class ThreadTest2 extends T implements Runnable

但通常情况下,使用的是内部类的形式:根据Runnable对象创建Thread对象。

Thread t=new Thread(new Runnable(){    public void run(){        //    }});

然后再调用start()启动线程

t.strat();//启动线程

线程的生命周期
7种状态:出生、就绪、运行、等待、休眠、阻塞、死亡。
线程的生命周期
run()执行完,线程结束(死亡)

操作线程的方法
一:线程的休眠
调用sleep(),它通常是在run()方法内的循环中被使用

try{    Thread.sleep(2000);//休眠2秒,2秒后进入就绪状态}catch(Exception e){//由于sleep()方法的执行可能抛出InterrupedException异常    e.printStackTrace();}

使用了sleep()的线程在一段时间后会醒来,但不能保证它醒来后进入运行状态,只能保证进入就绪状态。

二:线程的加入
调用join()。假如有一个线程threadA在执行,这时候要加入线程threadB,可以怎么做?在threadA的run()方法中调用threadB.join(),这时候threadA暂停且等待线程threadB执行完再执行。

三:线程的中断
在以前,会使用stop()方法中断一个线程,但是新的jdk版本已经停用了这个方法。现在常用的方法是设置一个变量boolean isContinue=false,在run()方法的while循环中加入一个判断

if(isContinue){    break;}

再写一个setContinue()方法

public void setContinue(){    isContinue=true;}

当要中断一个线程时,调用setContinue()。

又或者:如果某个线程使用了sleep()或wait()方法进入了就绪状态,可以使用Thread类中interrupt(),此时会抛出InterrptedException异常,我们就可以在处理异常catch时中断线程break。如:

try{    thread.sleep(1000);}catch(Exception e){    break;}--------省略其他代码------------thread.interrupt();

需要注意的是,调用interrupt()并不能终止线程,因为它只是改变标识变量的值。更多http://www.importnew.com/17027.html

四:线程的同步
因为一个进程的不同线程经常是共享资源的,这就会造成资源抢占,且因为对资源的检测不及时,而导致资源的分配出现问题。synchronized关键字可用于资源的同步,实际上就是对线程共享的资源加上一个安全锁,每次对资源的检测完成后,新的线程才可以访问资源。synchronized的两种使用方法:

//同步块synchronized(Object){}//同步方法public synchronized void method(){}