스레드, 스레드 풀,threadlocal

2383 단어 threadLocal
하나의 스레드 탱크에 두 개의 스레드와 네 개의 작업 (runnable) 을 넣는다.두 라인이 네 개의runnable를 실행합니다.threadlocal의 값은 같은 라인에 공유되며, 다른 작업일 수도 있습니다.
코드 보기:
package thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestThreadPoolExecutor{
	public static void main(String[] args) throws InterruptedException {
		int threadNum=2;//        
		int taskNum=4;//    runnable  ,           
		ExecutorService threads=Executors.newFixedThreadPool(threadNum);
		for (int i = 0; i < taskNum; i++) {
			threads.execute(new MyRunnable("thread"+i));
		}
		while(!threads.isTerminated()){
			Thread.sleep(1000);
			if (!threads.isShutdown()) {
				threads.shutdown();
				System.out.println("     ,          ");
				try{
					threads.execute(new MyRunnable("threadN"));
				}catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		System.out.println("       ");
		Thread.sleep(5000);
		System.out.println("     ");
	}
}
class MyRunnable implements Runnable{
	private String name;
	public MyRunnable(String name){
		this.name=name;
	}
	public static ThreadLocal<Integer> locInt=new ThreadLocal<Integer>(){
		protected Integer initialValue() {
			return 0;
		}
	};
	public void run() {
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		int i=locInt.get();
		System.out.println(Thread.currentThread().getId()+" "+name+" i:"+i);
		i++;
		locInt.set(i);
	}
	
}
 
실행 결과:
     ,          java.util.concurrent.RejectedExecutionException

	at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1760)
	at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:767)
	at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:658)
	at pp.thread.TestThreadPoolExecutor.main(TestThreadPoolExecutor.java:20)
8 thread0 i:0
9 thread1 i:0
8 thread2 i:1
9 thread3 i:1
       
     

좋은 웹페이지 즐겨찾기