Java实现多线程的方式主要有4种,直接上代码。
继承Thread类
最基础的方式,缺点是不能多继承。
public class MyThread extends Thread {
public MyThread() {
}
@Override
public void run() {
// TODO Auto-generated method stub
//需要在多线程内执行的代码....
}
public static void main(String[] args) {
// TODO Auto-generated method stub
MyThread my=new MyThread();
my.start();//启动线程
}
}
实现Runnable接口
更适用于需要多线程处理同一数据的场景。
public class MyRunnable implements Runnable {
public MyRunnable() {
}
@Override
public void run() {
// TODO Auto-generated method stub
//需要在多线程内执行的代码....
}
public static void main(String[] args) {
new Thread(new MyRunnable()).start();//启动线程
}
}
创建线程池
每一个线程代码结束后,并不会死亡,而是回到线程池中成为空闲状态,等待下一个对象调用。
public class ExecutorsTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//方式1:创建可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
ExecutorService pool=Executors.newCachedThreadPool();
pool.execute(new MyRunnable());
pool.shutdownNow();//结束线程池,不可再提交新任务,并停止当前正在执行的任务
//方式2:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
pool= Executors.newFixedThreadPool(2);
pool.submit(new MyRunnable());
pool.shutdown();//结束线程池,不可再提交新任务。已提交的任务将继续执行
//还有其它方式...这里不做过多列举
}
}
实现Callable接口
用Callable搭配线程池实现多线程,可带有线程处理的返回值。
public class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
// TODO Auto-generated method stub
//可在此方法内编写多线程代码,并带有返回值
return 0;//返回泛型的结果
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ExecutorService pool=Executors.newFixedThreadPool(2);
Future<Integer> f=pool.submit(new MyCallable());
try {
Integer res=f.get();//获取线程执行后的返回值
System.out.println(res);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}