java线程技术分享,java多线程技术点( 三 )


}
}
class MyRunnable implements Runnable {
@Override
public void run {
System.out.println(Thread.currentThread.getName + "\t" + Thread.currentThread.getId);
}
}
通过Callable和Future创建线程:
public class CallableCreateTest {
public static void main(String[] args) throws Exception {
// 将Callable包装成FutureTask,FutureTask也是一种Runnable
MyCallable callable = new MyCallable;
FutureTask<Integer> futureTask = new FutureTask<>(callable);
new Thread(futureTask).start;
// get方法会阻塞调用的线程
Integer sum = futureTask.get;
System.out.println(Thread.currentThread.getName + Thread.currentThread.getId + "=" + sum);
}
}
class MyCallable implements Callable<Integer> {
@Override
public Integer call throws Exception {
System.out.println(Thread.currentThread.getName + "\t" + Thread.currentThread.getId + "\t" + new Date + " \tstarting...");
int sum = 0;
for (int i = 0; i <= 100000; i++) {
sum += i;
}
Thread.sleep(5000);
System.out.println(Thread.currentThread.getName + "\t" + Thread.currentThread.getId + "\t" + new Date + " \tover...");
return sum;
}
}
线程池方式创建:
实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类 。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承,但可以多实现啊),只能实现接口 。同时,线程池也是非常高效的,很容易实现和使用 。
实际开发中,阿里巴巴开发插件一直提倡使用线程池创建线程,原因在下方会解释,所以上面的代码我就只简写了一些Demo 。
2.1 线程池创建线程
线程池,顾名思义,线程存放的地方 。和数据库连接池一样,存在的目的就是为了较少系统开销,主要由以下几个特点:
降低资源消耗 。通过重复利用已创建的线程降低线程创建和销毁造成的消耗(主要) 。
提高响应速度 。当任务到达时,任务可以不需要等到线程创建就能立即执行 。
提高线程的可管理性 。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性 。
Java提供四种线程池创建方式:

  • newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程 。
  • newFixedThreadPool创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待 。
  • newScheduledThreadPool创建一个定长线程池,支持定时及周期性任务执行 。
  • newSingleThreadExecutor创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行 。
通过源码我们得知ThreadPoolExecutor继承自AbstractExecutorService,而AbstractExecutorService实现了ExecutorService 。
public class ThreadPoolExecutor extends AbstractExecutorService
public abstract class AbstractExecutorService implements ExecutorService

java线程技术分享,java多线程技术点

文章插图
2.2 ThreadPoolExecutor介绍
实际项目中,用的最多的就是ThreadPoolExecutor这个类,而《阿里巴巴Java开发手册》中强制线程池不允许使用Executors去创建,而是通过New ThreadPoolExecutor实例的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险 。
java线程技术分享,java多线程技术点

文章插图
我们从ThreadPoolExecutor入手多线程创建方式,先看一下线程池创建的最全参数 。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,

推荐阅读