java并发笔记

来源:互联网 发布:win10怎么更改公用网络 编辑:程序博客网 时间:2024/05/16 06:09

1.java的中断机制
java的中断机制就是为了让java的线程退出的一种机制,通过改变线程的状态,Thread提供了thread.interrupt方法使线程中断,然后线程可以抛出interruptedException使线程退出,或者在run()方法中判断线程的状态(isRuppted)方法,判断是否继续执行,从而使线程可以退出。

2.线程的休眠和恢复
使用sleep方法可以是当前线程进入睡眠,过了指定时间后会自动恢复。如果这个时候打断线程,会抛出InterruptException.

3.等待另外线程的终止
使用join()方法
Eg:
static class LocalSourceLoader implements Runnable{

    @Override    public void run() {        System.out.println("begin load LocalSourceLoader....");        try {            TimeUnit.SECONDS.sleep(5);        } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        System.out.println("end load LocalSourceLoader....");    }}static class NetWorkSourceLoader implements Runnable{    @Override    public void run() {        System.out.println("begin load NetWorkSourceLoader....");        try {            TimeUnit.SECONDS.sleep(5);        } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        System.out.println("end load NetWorkSourceLoader....");    }}public static void main(String[] args) {    LocalSourceLoader localSourceLoader = new LocalSourceLoader();    NetWorkSourceLoader netWorkSourceLoader = new NetWorkSourceLoader();    Thread thread1 = new Thread(localSourceLoader,"localSourceLoader");    Thread thread2 = new Thread(netWorkSourceLoader,"netWorkSourceLoader");    thread1.start();    thread2.start();    try {        thread1.join();        thread2.join();    } catch (InterruptedException e) {        e.printStackTrace();    }    System.out.printf("Main :load success %S",new Date());}

4.守护线程
守护线程优先级比较低,其他线程没有执行时,才会执行,守护线程结束后,jvm也就结束程序。守护线程可以用来处理收尾的工作任务。
Eg:
/**
*
*/
package thread;

import java.util.ArrayDeque;
import java.util.Date;
import java.util.Deque;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

import org.hamcrest.core.Every;

/**
* @author JianJiang
*
*/
public class Test1 {

static class Event {    /**     * Date of the event     */    private Date date;    /**     * Message of the event     */    private String event;    /**     * Reads the Date of the event     *      * @return the Date of the event     */    public Date getDate() {        return date;    }    /**     * Writes the Date of the event     *      * @param date     *            the date of the event     */    public void setDate(Date date) {        this.date = date;    }    /**     * Reads the message of the event     *      * @return the message of the event     */    public String getEvent() {        return event;    }    /*     * (non-Javadoc)     *      * @see java.lang.Object#toString()     */    @Override    public String toString() {        return "Event [" + (date != null ? "date=" + date + ", " : "")                + (event != null ? "event=" + event : "") + "]";    }    /**     * Writes the message of the event     *      * @param event     *            the message of the event     */    public void setEvent(String event) {        this.event = event;    }}static class WriterTask extends Thread {    private AtomicInteger atomicInteger = new AtomicInteger();    private Deque<Event> deque;    public WriterTask(Deque<Event> deque) {        this.deque = deque;    }    /*     * (non-Javadoc)     *      * @see java.lang.Thread#run()     */    @Override    public void run() {        for (int i = 0; i < 100; i++) {            Event event = new Event();            event.setDate(new Date());            event.setEvent(String.format("The thread %s has generated an event",Thread.currentThread().getId()));            deque.addFirst(event);            System.out.println("添加元素:"+event);            try {                TimeUnit.SECONDS.sleep(1);            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }}static class CleanTask extends Thread {    private Deque<Event> deque;    public CleanTask(Deque<Event> deque) {        this.deque = deque;        setDaemon(true);    }    /*     * (non-Javadoc)     *      * @see java.lang.Thread#run()     */    @Override    public void run() {        while (true) {            Date date = new Date();            clean(date);        }    }    /**     * Method that review the Events data structure and delete     * the events older than ten seconds     * @param date     */    private void clean(Date date) {        long difference;        boolean delete;        if (deque.size()==0) {            return;        }        delete=false;        do {            Event e = deque.getLast();            difference = date.getTime() - e.getDate().getTime();            if (difference > 3000) {                System.out.printf("Cleaner: %s\n",e.getEvent());                deque.removeLast();                delete=true;            }           } while (difference > 10000);        if (delete){            System.out.printf("Cleaner: Size of the queue: %d\n",deque.size());        }    }}public static void main(String[] args) {    Deque<Event> deques = new ArrayDeque<>();    WriterTask writerTask1 = new WriterTask(deques);    WriterTask writerTask2 = new WriterTask(deques);    WriterTask writerTask3 = new WriterTask(deques);    CleanTask cleanTask = new CleanTask(deques);    writerTask1.start();    writerTask2.start();    writerTask3.start();    cleanTask.start();}

}

5.线程中异常的处理
非运行时异常和运行时异常

/**
*
*/
package thread;

import java.lang.Thread.UncaughtExceptionHandler;

/**
* @author JianJiang
*
*/
public class Test1 {

static class Thread1 extends Thread{    /* (non-Javadoc)     * @see java.lang.Thread#run()     */    @Override    public void run() {        Integer.parseInt("sss");    }}static class ExceptionHandler implements UncaughtExceptionHandler{    @Override    public void uncaughtException(Thread t, Throwable e) {        System.out.printf("An exception has been captured\n");        System.out.printf("Thread: %s\n",t.getId());        System.out.printf("Exception: %s: %s\n",e.getClass().getName(),e.getMessage());        System.out.printf("Stack Trace: \n");        e.printStackTrace(System.out);        System.out.printf("Thread status: %s\n",t.getState());    }}public static void main(String[] args) {    Thread1 t = new Thread1();    t.setUncaughtExceptionHandler(new ExceptionHandler());    t.start();}

}

0 0
原创粉丝点击