Java多线程创建的三种方式
方法一:继承Thread类(继承存在OOP单继承局限性。(不推荐))
实现步骤为:继承Thread类、重写run()方法、调用start()方法启动线程。
//继承Tread、重写run方法、创建继承类、调用start方法
public class ThreadTest extends Thread{
@Override
public void run() {
for (int i = 0; i < 400; i++) {
System.out.println("我在看代码");
}
}
public static void main(String[] args) {
ThreadTest threadTest = new ThreadTest();
threadTest.start();//子线程与主线程并行(交替执行)
// threadTest.run();//先执行run方法再回到主线程继续执行后续代码
for (int i = 0; i < 400; i++) {
System.out.println("我在学习多线程");
}
}
}
输出结果为:
我在学习多线程
…
我在看代码
…
我在学习多线程
…
我在看代码
方法二:Runnable接口创建(实现避免局限性,灵活方便,方便一个对象被多个线程使用。(推荐))
创建Runnable实现类,重写run方法,创建Thread对象并且将实现对象作为参数传入,调用start方法(Thread类其实是实现了Runnable接口),
@Override
public void run() {
for (int i = 0; i < 800; i++) {
System.out.println("我学习runnable");
}
}
public static void main(String[] args) {
RunnableTest runnableTest = new RunnableTest();
// 写法一
// Thread thread = new Thread(runnableTest);
// thread.start();
// 写法二
new Thread(runnableTest).start();
//电脑运行速度快,如果结果上看不出线程穿插进行,可增大i最大值,或添加睡眠
for (int i = 0; i < 800; i++) {
System.out.println("我在看代码");//主线程
}
}
}
方法三:实现callable接口
1. 实现callable接口,需要有返回值类型。
2. 重写call方法,需要抛出异常。
3. 创建目标对象。
4. 创建执行任务 ExecutorSservice ser = Executors.newFixedThreadPool(1);
5. 提交执行:Future<返回类型> result1 = ser.submit(目标对象名);
6. 获取结果 : <返回类型> r1 = result1.get();
7. 关闭服务:ser.shutdown();
实现接口:
//实现接口,需要有返回值
public class CallableTest implements Callable<V> {
public V call() throws Exception{
....
....
return ...;
}
创建线程并运行:
// 创建三个线程实例
CallableTest t1 = new CallableTest();
CallableTest t2 = new CallableTest();
CallableTest t3 = new CallableTest();
// 创建执行任务,线程池容量为3
ExecutorService ser = Executors.newFixedThreadPool(3);
// 提交执行
Future<Boolean> res1 = ser.submit(t1);
Future<Boolean> res2 = ser.submit(t2);
Future<Boolean> res3 = ser.submit(t3);
// 获取结果
Boolean r1 = res1.get();
// 关闭服务
ser.shutdown();