您的位置:首页 > 编程语言 > Java开发

java并发笔记

2015-05-30 22:58 483 查看
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并发