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可以将线程设置为后台线程,从而保证在非后台线程结束时程序终止并杀死所有后台线程。