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();}
}
- Java并发学习笔记
- Java 并发整理笔记
- java并发编程笔记
- java并发笔记
- Java并发编程笔记
- Java高并发笔记
- java 并发笔记
- Java并发编程笔记
- java线程并发笔记
- Effective Java 并发笔记
- Java笔记-并发
- Java并发编程笔记
- Java并发笔记一
- Effective java-并发 笔记
- java并发学习笔记
- JAVA并发编程笔记
- Java 并发笔记
- 【Java】Java并发学习笔记
- 求N阶矩阵
- Cookie和Session详解
- linux中c语言errno的使用
- 萃取(traits)编程技术的介绍和应用
- 心情
- java并发笔记
- 飞机大战-子弹的实现
- NGUI所见即所得之深入剖析UIPanel,UIWidget,UIDrawCall底层原理
- memcached linux安装
- android Touch事件分发机制
- 那些真实
- uibutton(上下左右箭头加放大和缩小)
- jackson的循环问题和hibernate懒加载问题
- memcached 项目中使用