5.27多線程中的線程組與線程池

線程組

package org.westos.線程組線程池博客練習;
/**
 * 線程組:ThreadGroup
 * 構造方法:
 * 		public ThreadGroup(String name)構造一個新線程組
 * 方法:
 * 		public final String getName()返回此線程組的名稱。 
 * 可以通過Thread類的getThreadGroup返回一個線程組
 * 		public final ThreadGroup getThreadGroup()返回該線程所屬的線程組。默認爲主線程main
 * */
public class Text1 {
	public static void main(String[] args) {
		MyThread1 my1 = new MyThread1();
		Thread t1 = new Thread(my1, "線程一");
		Thread t2 = new Thread(my1, "線程二");
		ThreadGroup tg1 = t1.getThreadGroup();
		ThreadGroup tg2 = t2.getThreadGroup();
		System.out.println(tg1.getName());//輸出main,線程組默認名稱爲主線程main
		System.out.println(tg2.getName());//輸出main,線程組默認名稱爲主線程main
		System.out.println(Thread.currentThread().getThreadGroup().getName());//輸出main,線程組默認名稱爲主線程main
		//如何設置一個線程組名稱
		ThreadGroup tg3 = new ThreadGroup("我是一個線程組");
		Thread t3 = new Thread(tg3, t2, "線程三");
		System.out.println(tg3.getName());
		System.out.println(t3.getThreadGroup().getName());
	}
}
package org.westos.線程組線程池博客練習;

public class MyThread1 implements Runnable {

	@Override
	public void run() {
		for(int i = 0;i<100;i++) {
			System.out.println(Thread.currentThread().getName()+"----"+i);
		}
	}

}

線程池

package org.westos.線程組線程池博客練習;

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

/**
 * 線程池:ThreadPool
 * 優點:
 * 		1.節約成本
 * 		2.線程池可以重複利用,線程池中的線程被調用執行完畢之後,會返回線程池中等待再次被調用
 * 線程池在Exceutos工廠類提供
 * 	方法:
 * 		public static ExecutorService newFixedThreadPool(int nThreads)
 * 			創建一個可重用固定線程數的線程池,以共享的無界隊列方式來運行這些線程	
 * 	ExecutorService:可以執行異步任務
 *		創建一個線程池,執行接口中的方法
 *		提交:Future<?> submit(Runnable task)
 *		<T> Future<T> submit(Callable<T> task)提交一個返回值的任務用於執行,返回一個表示任務的未決結果的 Future	
 * */
public class Text2 {
	public static void main(String[] args) {
		
		//創建一個線程池
		ExecutorService pool = Executors.newFixedThreadPool(2);
		//提交和Runnable接口的方法或者Callable(提交任務)
		MyThread1 my = new MyThread1();
		pool.submit(my);
		pool.submit(new MyThread1());
		//關閉線程池
		pool.shutdown();
		//將會輸出	pool-1-thread----2 :線程池-池數-線程類對象的描述-編號(從1開始)
	}
}

多線程實現第三種

package org.westos.線程組線程池博客練習;

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

/**
 * 多線程的實現方式第三種:
 *  	前提:自定義類實現Callable接口
 *		1)創建線程池對象: Executors 裏面的那個方法,返回的是ExecutorsService
 *		2) 然後調用ExecutorsService裏面的提交任務的方法:
 *		<T> Future<T> submit(Callable<T> task)提交一個返回值的任務用於執行
 *		3)關閉線程池
 * */
public class Text3 {
	public static void main(String[] args) {
		//創建一個線程池對象
		ExecutorService pool = Executors.newFixedThreadPool(2);
		//提交任務
		pool.submit(new MyCallable());
		pool.submit(new MyCallable());
		//關閉線程池
		pool.shutdown();
	}
}
package org.westos.線程組線程池博客練習;

import java.util.concurrent.Callable;

public class MyCallable implements Callable {

	@Override
	public Object call() throws Exception {
		for(int i= 0;i<100;i++) {
			System.out.println(Thread.currentThread().getName());
		}
		return null;
	}

}
含有返回值得Callable
package org.westos.線程組線程池博客練習;

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

//含有返回值的Callable
public class Text4 {
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		//創建線程池對象
		ExecutorService pool = Executors.newFixedThreadPool(2);
		//提交任務
		Future<Integer> i1 = pool.submit(new MyCallable2(100));
		Future<Integer> i2 = pool.submit(new MyCallable2(200));
		//獲取結果
		System.out.println("1~100的和爲"+i1.get());
		System.out.println("1~200的和爲"+i2.get());
		//關閉線程池
		pool.shutdown();
	}
}
package org.westos.線程組線程池博客練習;

import java.util.concurrent.Callable;

public class MyCallable2 implements Callable<Integer> {
	private int num;
	public MyCallable2(int num) {
		this.num = num;
	}
	@Override
	public Integer call() throws Exception {
		int sum = 0;
		for(int i=0;i<=num;i++) {
			sum = sum+i;
		}
		return sum;
	}

}




發佈了61 篇原創文章 · 獲贊 6 · 訪問量 7909
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章