java并发、多线程知识点总结

1、Web库类、Sevlet天生有多线程性。

2、定义任务:使用Runnable接口并实现run()方法。   而将runnable (不返回任何值) 对象编程工作任务的方式为

Thread t = new Thread(new Task()); 
t.start();

这里start()会迅速返回,因为每个任务都由不同的线程执行,不影响main()中的其他任务操作。

如果想要添加更多的线程,就可以使用for循环来进行操作:

for(int i=0; i<5; i++)
    new Thread(new Task()).start();

也可使用线程池来存储线程

ExecutorService exec = Executors.newCachedThreadPool();
for(int i=0; i<5; i++)
    exec.execute(new Task());
exec.shutdown();

newCachedThreadPool可以使用其他Executor代替,比如固定线程个数的newFixedThreadPool,还有接受线程数量为1的SingleThreadExecutor (特殊的newFixedThreadPool),其会序列化所有提交的任务并维护它自己的悬挂任务队列。

当有大量线程并且运行的任务为使用文件系统时,可以使用SingleThreadExecutor 以保证任何线程中都只有唯一的任务运行。

3、如果需要线程有返回值,则使用Callable接口,带有call函数并且使用exec.submit()来调用,而submit方法会产生Future对象 (使用Callable返回结果的特定类型并进行参数化),然后使用Future.get函数来获取结果。

4、可以使用sleep()来控制任务之间的顺序运行,可以跑出InterruptedException异常。但因为顺序行为依赖于底层的线程机制,在不同的操作系统之间有差异。所以控制任务执行,最好使用同步控制,或者编写协作例程。

5、调用Thread.setDaemon可以将线程设置为后台线程,从而保证在非后台线程结束时程序终止并杀死所有后台线程。


猜你喜欢

转载自blog.csdn.net/u010358304/article/details/79853068