Java核心技术——多线程

来源:互联网 发布:怎样加入淘宝外卖 编辑:程序博客网 时间:2024/06/05 16:17

一、在一个单独的线程中执行一个任务的简单过程

(1)将任务代码移到实现了Runnable接口的类的run方法中。该接口如下所示:

public interface Runnable() {public void run() {}}

(2)创建一个类对象:

Runnable r=new MyRunnable();

(3)由Runnable创建一个Thread对象

Thread t=new Thread(r);

(4)启动线程

t.start();

注意:不要调用Thread类或Runable对象的run方法。直接调用run方法,只会执行同一个线程中的任务,而不会启动新线程;而t.start()方法将创建一个执行run方法的新线程。

(5)例子:

public class TestThread {public static void main(String[] args){Runnable runnable=new FirstRunnable();Runnable runnable2=new SecondRunnable();Thread thread=new Thread(runnable);Thread thread2=new Thread(runnable2);thread.start();thread2.start();}}class FirstRunnable implements Runnable{@Overridepublic void run() {for(int i=1;i<100;i++){System.out.println("123");}}}class SecondRunnable implements Runnable{@Overridepublic void run() {for(int j=1;j<100;j++){System.out.println("abc");}}}

二、中断线程

没有可以强制线程终止的方法,然而,interrupt方法可以用来请求终止线程。

当对一个线程调用interrupt方法时,线程的中断状态将被置位,如果线程被阻塞(调用sleep或wait)就无法检测中断状态。在一个被阻塞的线程上调用interrupt方法时,阻塞调用将会被InterruptedException异常中断。

三、线程状态

线程可以有6种状态:New,Runnable,Blocked,Waiting,Timed waiting,Terminated。

四、线程属性

4.1 线程优先级

默认情况下,一个线程继承它的父线程的优先级,可用setPriority方法提高或降低任何一个线程的优先级。MIN_PRIORITY=1, MAX_PRIORITY=10。、

线程优先级高度依赖于系统,映射到宿主平台上,Windows有7个优先级,Linux中优先级被忽略。

4.2 守护线程

t.setDaemon(true);将线程设为守护线程。

守护线程的唯一用途是:为其他线程提供服务。

五、线程同步

5.1 锁对象和条件对象

(1)锁用来保护代码片段,任何时刻只能有一个线程执行被保护的代码。

(2)锁可以管理试图进入被保护代码段的线程。

(3)锁可以拥有一个或多个相关的条件对象。

(4)每个条件对象管理那些已经进入被保护的代码段但还不能运行的线程。

5.2 synchronized关键字

Java中的每一个对象都有一个内部锁,如果一个方法用synchronized关键字申明,那么对象的锁将保护整个方法,即,要调用该方法,线程必须获得内部的对象锁。

内部对象只有一个相关条件。wait方法添加一个线程到等待集中,notifyAll/notify方法解除等待线程的阻塞状态。这三个方法是Object类的方法。

5.3阻塞队列

建议使用阻塞队列来同步完成一个共同任务的线程,synchronized关键字次之,有特别需要才使用锁对象和条件对象。




















0 0