java线程的创建方式
java线程的创建方式大致可以分为四种:
1,通过继承Thread类创建线程
2,通过实现Runnable接口创建线程
3,实现Callable接口,通过FuturaTask调度
4,使用线程池框架创建线程(暂不做介绍)
- 1,通过继承Thread类创建线程
package day717.Thread;
/**
* 创建线程方法一:
* 创建普通类 继承thread
* 重写run()方法
* 创建当前类的对象调用start()方法启动线程
* @author 黄小宝
*
*/
public class MyThread1 extends Thread{
//重写run()方法
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("子线程:"+i);
}
}
public static void main(String[] args) {
//创建线程对象
MyThread1 t1= new MyThread1();
//t1.run();//这不叫线程启动,这是方法调用
t1.start();//线程启动调用start()方法
// //采用匿名内部类实现
// new Thread() {
// @Override
// public void run() {
//
// for (int i = 0; i < 10; i++) {
// System.out.println("子线程:"+i);
// }
// }
// }.start();
//主线程
for (int i = 0; i < 10; i++) {
System.out.println("主线程--------->"+i);
}
}
}
运行结果:
主线程--------->0
子线程:0
主线程--------->1
子线程:1
主线程--------->2
子线程:2
主线程--------->3
子线程:3
子线程:4
子线程:5
子线程:6
子线程:7
子线程:8
子线程:9
主线程--------->4
主线程--------->5
主线程--------->6
主线程--------->7
主线程--------->8
主线程--------->9
- 2,通过继承Runnable接口创建线程
/**
* 线程创建的方法二
* 1创建一个java类继承runnable接口
* 2重写run()方法
* @author 黄小宝
*
*/
public class MyThread2 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("子线程--------->"+i);
}
}
public static void main(String[] args) {
//创建一个实现了runnable接口的类的对象
MyThread2 t2=new MyThread2();
Thread t=new Thread(t2);
t.start();
//也可以使用匿名内部类或者拉姆达表达式实现
// new Thread(new Runnable() {
//
// @Override
// public void run() {
// for (int i = 0; i < 10; i++) {
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// System.out.println("子线程--------->"+i);
// }
// }
// }).start();;
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("主线程"+i);
}
}
}
运行结果:
主线程0
子线程--------->0
主线程1
子线程--------->1
主线程2
子线程--------->2
主线程3
主线程4
主线程5
主线程6
主线程7
主线程8
主线程9
子线程--------->3
子线程--------->4
子线程--------->5
子线程--------->6
子线程--------->7
子线程--------->8
子线程--------->9
通过实现ruannable接口去创建对象也需要通过Thread去创建对象然后再调用start()方法。
- 3,通过实现Callable接口,通过FuturaTask调度
package day717.Thread;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
/***
* 线程创建方式三
* 创建类,实现callable接口
* 启动方法start()
*实现call方法
*
* @author 黄小宝
*
*/
public class MyThread3 implements Callable<Integer>{
@Override
public Integer call() throws Exception {
int sum=0;
for (int i = 1; i<=100; i++) {
sum+=i;
System.out.println("本次计算结果:"+sum);
}
return sum;
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
//这里也就是设计模式中的:装饰器模式
//创建实现该接口的类的对象
MyThread3 t3= new MyThread3();
//基于callable创建futuretask
FutureTask<Integer> task=new FutureTask<Integer>(t3);
//将futuretask作为参数传递给thread
Thread t=new Thread(task);
t.start();
//获取返回结果
int count=task.get();
System.out.println("最终结果:"+count);
}
}
运行结果:
本次计算结果:1
本次计算结果:3
本次计算结果:6
本次计算结果:10
本次计算结果:15
本次计算结果:21
本次计算结果:28
本次计算结果:36
本次计算结果:45
本次计算结果:55
本次计算结果:66
本次计算结果:78
本次计算结果:91
本次计算结果:105
本次计算结果:120
本次计算结果:136
本次计算结果:153
本次计算结果:171
本次计算结果:190
本次计算结果:210
最终结果:210