java中目前我只了解4 种获得多线程的方法 :
1.继承Thread类 ,重写run方法
2.new Thread(实现Runnable接口)
3. FutureTask ft = new FutureTask<Integer>(new MyThread());
new Thread(ft).start();
MyThread自己写的 实现了Callable<>接口
FutureTask<>本身就实现了Runable接口
4. 通过工具类 Executors 获得线程池
先说四种常用方法:
ExecutorService service = Executors.newFixedThreadPool(5);// 一池5线程
ExecutorService service = Executors.newSingleThreadExecutor();// 一池1线程
ExecutorService service = Executors.newCachedThreadPool();//根据当前任务量自动调节池中线程数
ScheduledExecutorService service = Executors.newScheduledThreadPool(5);//一池5线程
前三个开启线程的方法是 :
Future<T> result = service.submit( 实现 Callable<T> 接口)
然后用得到的 result.get() 获取 call()方法的返回值.
最后一个有点特殊:
ScheduledFuture<T> result = service.schedule ( 实现 Callable<T> 接口, 秒数, TimeUnit.SECONDS);
这个schedule方法有什么不同呢?
他可以设定从该线程池中获得线程的最小间隔时间,比如规定100毫秒内只允许请求使用一个线程,其他请求就等着
这样可以大大的减少服务器压力
三个参数:
第一个不用讲了.
第二个 需要整数,获得线程的最小间隔时间.
第三个参数是TimeUnit枚举类型 设置第二个参数的单位
下面是代码:
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
/**
* 获得线程池的四种方式
* @author start_lie
*/
public class Test3
{
public static void main(String[] args)
{
ScheduledExecutorService service = Executors.newScheduledThreadPool(5);//一池5线程
ScheduledFuture<Integer> result = null;
try
{
for (int i = 1; i <=15; i++)
{
result = service.schedule(() -> {
System.out.print(Thread.currentThread().getName());
return new Random().nextInt(30);
}, 2, TimeUnit.SECONDS);
System.out.println("*******result: "+result.get());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
service.shutdown();
}
}
private static void testThreadPool()
{
//ExecutorService service = Executors.newFixedThreadPool(5);//一池5线程
//ExecutorService service = Executors.newSingleThreadExecutor();//一池1线程
ExecutorService service = Executors.newCachedThreadPool();
Future<Integer> result = null;
try
{
for (int i = 1; i <=15; i++)
{
result = service.submit(() -> {
System.out.print(Thread.currentThread().getName());
return new Random().nextInt(30);
});
System.out.println("*******result: "+result.get());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
service.shutdown();
}
}
}