Java 多线程

来源:互联网 发布:php报undefined index 编辑:程序博客网 时间:2024/05/17 21:20

1、进程与线程

操作系统是以进程为单位控制的,进程是一次完整的处理单元,一个进程包含了多个线程,线程不能脱离进程而单独存在。

2、Java实现多线程

多线程的实现需要一个线程主类,一个线程主类的对象表示一个线程,此主类需要继承Thread类或实现Runnable接口或实现Callable接口,之后,需要覆写run()方法,此方法是线程执行的开始点。

其中Thread类是Runnable接口的子类,Callable接口(不常用)是一个提供返回值类型的线程接口。

例1:

MyThread extends Thread {

public void run(){

}

}

例2:

MyThread implements Runnable {

public void run(){

}

}

由于继承Thread类会存在单继承局限,因此,在开发中常以实现Runnable接口为主。但是需要注意的是:线程的启动永远依靠Thread类的start()方法。为此,在Thread类的构造方法中可以接收Runnable接口对象:public Thread(Runnable target) ;

例3:

MyThread thread = new MyThread() ;

Thread t1 = new Thread(thread) ;//thread向上转型为Runnable

t1.start() ;

注意:同一线程不能重复启动,否则会出现异常:java.lang.IllegalThreadStateException。

3、线程常用方法

构造方法:public Thread(Runnable target, String name) ;

取得当前线程对象:public static Thread currentThread() ;

取得线程对象名字:public final String getName() ;

设置线程对象名字:public final void setName() ;

线程休眠:public static void sleep(long millis) throws InteruptedException ;


线程启动后执行的是并发执行,因此,不存在执行的先后顺序,而是哪个线程先抢到资源,哪个先执行。所以,在Thread类中提供了设置线程的优先级的方法和优先级常量:


设置线程优先级:public final void setPriority(int newPriority) ;

取得线程优先级:public final int getPriority() ;

优先级常量:

最高优先级:public static final int MAX_PRIORITY,数值:10 ;

中等优先级:public static final int NORM_PRIORITY,数值:5 ;

最低优先级:public static final int MIN_PRIORITY,数值:1 ;

注意:需要注意的是,线程的优先级是相对而言的,并不是说优先级高的线程就先执行,而是指,优先级高的线程先执行的可能性变大。

4、线程的同步与死锁

多线程的出现使得程序执行效率提高,但是也有问题产生。由于线程是并发执行,因此,对于多线程访问同一资源时就有可能出现资源配置错误。因此,为了保证线程访问同一资源是排队的形式可以使用关键字synchronize定义的同步块或者同步方法实现。

(1)同步块定义:

synchronize(同步对象) {同步代码}

说明:同步对象用当前对象表示(this)。

(2)同步方法定义:

public synchronize 返回值类型 方法名称(参数类型 参数,...) {同步代码}

注意:同步处理速度慢,数据安全性高,数据线程安全操作;非同步(异步)速度快,数据不安全,数据非线程安全操作。

5、线程池:包含一组线程的对象

线程池在java.util.concurrent包中定义,使用ExecutorService、ScheduledExecutorService实现处理。

在Executor类中有四种线程池的定义形式:

无大小限制的线程池:public static ExecutorService newCachedThreadPool() ;

固定大小的线程池:public static ExecutorService newFixedThreadPool() ;

单线程池:public static ExecutorService newSingleThreadExecutor() ;

定时调度线程池:public static ScheduledExecutorService newScheduledThreadPool() ;

0 0
原创粉丝点击