使用线程
实现Runnable接口
实现Callable接口
继承Thread类
线程池创建
1.实现Runnable接口
public class MyRunnable implements Runnable {
@Override
public void run() {
// ...
}
}
使用Runnable实例再创建一个Thread实例的start()方法来启动线程
public static void main(String[] args) {
MyRunnable instance = new MyRunnable();
Thread thread = new Thread(instance);
thread.start();
}
2.实现Callable接口
与Runnable相比,Callable可以有返回值,返回值通过FutureTask进行封装
public class MyCallable implements Callable<Integer>{
public Integer call(){
return 123;
}
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
MyCallable mc = new MyCallable();
FutureTask<Integer> ft = new FutureTask<>(mc);
Thread thread = new Thread(ft);
thread.start();
System.out.println(ft.get());
}
3.继承Thread类型
public class MyThread extends Thread {
public void run() {
// ...
}
}
public static void main(String[] args) {
MyThread mt = new MyThread();
mt.start();
}
4.线程池
线程池创建有四种方式:
1.可缓存的线程池
public static void main(String[] args) {
ExecutorService executorService= Executors.newCachedThreadPool();
for(int i=0;i<10;i++){
try{
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"正在执行");
try{
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
2.可重用的,固定线程数的线程池
public static void main(String[] args) {
ExecutorService fixedThreadPool= Executors.newFixedThreadPool(3);
for (int i=0;i<10;i++){
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName()+"正在被执行");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
3.定义一个长线程池,支持定时周期性的任务执行,延迟执行实例代码
public static void main(String[] args) {
//创建一个定长线程池,支持定时及周期性任务执行——延迟执行
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
//延迟1秒执行
/*scheduledThreadPool.schedule(new Runnable() {
public void run() {
System.out.println("延迟1秒执行");
}
}, 1, TimeUnit.SECONDS);*/
//延迟1秒后每3秒执行一次
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
public void run() {
System.out.println("延迟1秒后每3秒执行一次");
}
}, 1, 3, TimeUnit.SECONDS);
}
4.创建一个单线程化的线程池,它只会唯一的工作线程来执行任务,报这个所有的任务按照指定顺序进行
public static void main(String[] args) {
ExecutorService singleThread= Executors.newSingleThreadExecutor();
for(int i=0;i<10;i++){
final int index=i;
singleThread.execute(new Runnable() {
@Override
public void run() {
try{
System.out.println(Thread.currentThread().getName()+"被执行了");
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}