Java并行程序基础

来源:互联网 发布:常见的网络促销方式 编辑:程序博客网 时间:2024/05/28 03:01

有关线程

进程是计算机中的程序关于某数据集合上的一次运动活动,是系统进行资源分配的基础单位。进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

线程的生命周期

线程的生命周期
线程的所有状态都在Thread的State枚举中

public enum State {    /**    * 表示刚刚创建的线程,这种线程还没开始执行。    **/    NEW,    /**    * 调用start()方法后,线程开始执行,处于RUNNABLE状态,    * 表示线程所需要的一切资源以及准备好。    **/    RUNNABLE,    /**    * 当线程遇到synchronized同步块,就进入了BLOCKED阻塞状态。    * 这时线程会暂停执行,直到获得请求的锁。    **/    BLOCKED,    /**    * WAITING和TIMED_WAITING都表示等待状态,他们是区别是WAITING表示进入一个无时间限制的等待    * TIMED_WAITING会进入一个有时间限制的等待。    * WAITING的状态正是在等待特殊的事件,如notify()方法。而通过join()方法等待的线程,则是等待目标线程的终止。    * 一旦等到期望的时间,线程就会继续执行,进入RUNNABLE状态。    * 当线程执行完后进入TERMINATED状态,表示线程执行结束。    **/    WAITING,    TIMED_WAITING,    TERMINATED;

线程的基本操作

新建线程

新建线程很简单,使用new创建一个线程对象,并将它start()。

Thread t1 = new Thread();t1.start();

start()方法会创建一个新线程,并执行run()方法。
注意:不要使用run()来开启线程。它只会在当前线程中,串行执行run()方法。

让线程执行指定逻辑,需要重载Thread的run()方法。

Thread t1 =new Thread(){@Overridepublic void run(){    ...}};t1.start();

也可以使用Runnable接口来实现相同操作。

public class A implements Runnable{@Overridepublic void run(){....}}#把Runnable的实例作为参数传入线程Thread t1 = new Thread(new A());t1.start();

终止线程

废弃的方法:stop()。
此方法太粗暴,会直接终止线程,并且立即释放线程持有的锁,破坏数据的一致性。

线程中断

线程中断并不会使线程立即退出,而是给线程发一个通知,告诉目标线程停止执行,至于目标线程接到通知后怎么处理,由线程自行决定。
线程中断相关的3个方法:

//Thread.interrupt() 是一个实例方法,他通知目标线程中断,也就是设置中断标志位。中断标志位表示当前线程已经被中断了。public void Thread.interrupt() ;//Thread.isInterrupted() 也是实例方法,他判断当前线程是否被中断(通过检查中断标志位) public boolean Thread.isInterrupted(); //Thread.interrupted() 是静态方法,判断当前线程的中断状态,但同时会清除当前线程的中断标志位状态。public static boolean Thread.interrupted() ;

示例1:

public class InterruptExample {    public static void main(String [] a){        Thread t1 = new Thread("线程小哥 - 1 "){            @Override            public void run() {                while (true){                    /**                     * 必须得判断是否接受到中断通知,如果不写退出方法,也无法将当前线程退出.                     */                    if (Thread.currentThread().isInterrupted()){                        System.out.println(Thread.currentThread().getName() + " Interrupted ... ");                        break;                    }                    Thread.yield();                }            }        };        t1.start();        try {            Thread.sleep(1500);        } catch (InterruptedException e) {            e.printStackTrace();        }        /**         * 给目标线程发送中断通知         * 目标线程中必须有处理中断通知的代码         * 否则,就算发送了通知,目标线程也无法停止.         */        t1.interrupt();    }}

示例2:

public class InterruptExample {    public static void main(String [] a){        Thread t1 = new Thread("线程小哥 - 1 "){            @Override            public void run() {                while (true){                    /**                     * 必须得判断是否接受到中断通知,如果不写退出方法,也无法将当前线程退出.                     */                    if (Thread.currentThread().isInterrupted()){                        System.out.println(Thread.currentThread().getName() + " Interrupted ... ");                        break;                    }                    try {                        /**                         * 处理业务逻辑花费10秒.                         * 而在这时,主线程发送了中断通知,当线程在sleep的时候如果收到中断                         * 则会抛出InterruptedException,如果在异常中不处理,则线程不会中断.                         *                         */                        Thread.sleep(10000);                    } catch (InterruptedException e) {                        System.out.println("我错了....");                        /**                         * 在sleep过程中,收到中断通知,抛出异常.可以直接退出线程.                         * 但如果还需要处理其他业务,则需要重新中断自己.设置中断标记位.                         * 这样在下次循环的时候 线程发现中断通知,才能正确的退出.                         */                        Thread.currentThread().interrupt();                    }                    Thread.yield();                }            }        };        t1.start();        try {            /**             * 处理业务500毫秒             * 然后发送中断通知,此时t1线程还在sleep中.             */            Thread.sleep(500);        } catch (InterruptedException e) {            e.printStackTrace();        }        /**         * 给目标线程发送中断通知         * 目标线程中必须有处理中断通知的代码         * 否则,就算发送了通知,目标线程也无法停止.         */        t1.interrupt();    }}

注意:

Thread.sleep()方法由于中断而抛出异常,此时,它会清除中断标志,如果不加处理,则捕获不到这个中断,故在异常处理中,再此设置中断标志。

等待(wait)和通知(notify)

原创粉丝点击