实现一个线程,必须创建一个thread实例,override run方法,并且调用start方法启动线程。
线程的生命周期分为new,runnable,running,block,termate.
1. 创建线程的方式- newThread的方式创建线程
- 线程池
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
}).start();
使用new Thread有很多弊端:
- 每次都new,线程缺乏统一管理,相互竞争抢占资源,性能差;
- 缺乏更多功能,如定时执行、定期执行、线程中断;
建议使用线程池。
1.2 线程池Java通过Executors提供四种线程池,分别为:
newCachedThreadPool:创建一个可缓存线程池,线程池大小根据JVM自行分配,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool:创建一个周期线程池,支持定时及周期性任务执行。
newSingleThreadExecutor:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
常用的是newCachedThreadPool,
package cn.com.gs.demo;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolTest {
public static ExecutorService execs = Executors.newCachedThreadPool();
public static void main(String[] args) {
// 模拟10个任务
for (int i = 0; i < 10; i++) {
// 线程内任务索引
int taskIndex = i;
try {
// 每隔一秒,向线程池添加一个任务,一秒足以让下面输出的任务执行完,
// 任务执行完线程就会空闲,即可实现线程的复用;
// 任务没有执行完,将会再次创建线程
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
execs.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "---->正在执行的任务-->" + taskIndex);
}
});
}
}
}



