一,继承Thread类
//1.定义一个线程类继承Thread
class MyThread extends Thread{
//2.重写run方法,里面是定义线程以后干啥
@Override
public void run() {
for(int i=1;i<=5;i++){
System.out.println("子线程run"+i);
}
}
}
public static void main(String[] args) {
//3.new一个新线程对象
Thread t=new MyThread();
//4.调用start方法(实际执行run方法)
//注意:如果对象t调用run方法而不是start方法就是单线程不是多线程
t.start();
for(int i=1;i<=5;i++){
System.out.println("主线程run"+i);
}
}
输出
实际上主线程和子线程是同时进行的
主线程run1
主线程run2
子线程run1
子线程run2
主线程run3
主线程run4
子线程run3
子线程run4
主线程run5
子线程run5
注意:1.如果对象t调用run方法而不是start方法就是单线程不是多线程。
2.主线程要放在子线程后面,不然就是单线程。
二,实现Runnable接口
1) 定义类重写接口
class MyRunnable implements Runnable{
@Override
public void run() {
for(int i=1;i<=5;i++){
System.out.println("子线程run"+i);
}
}
}
public static void main(String[] args) {
Runnable r=new MyRunnable();
Thread t=new Thread(r);
t.start();
for(int i=1;i<=5;i++){
System.out.println("主线程run"+i);
}
}
2)匿名内部类
public static void main(String[] args) {
//1.匿名内部类
Runnable r=new Runnable() {
@Override
public void run() {
for(int i=1;i<=5;i++){
System.out.println("子线程1run"+i);
}
}
};
Thread t=new Thread(r);
t.start();
// 2.简化
new Thread(new Runnable() {
@Override
public void run() {
for(int i=1;i<=5;i++){
System.out.println("子线程2run"+i);
}
}
}).start();
//3.lambda再简化
new Thread( ()->{
for(int i=1;i<=5;i++){
System.out.println("子线程3run"+i);
}
}).start();
for(int i=1;i<=5;i++){
System.out.println("主线程run"+i);
}
}
输出
子线程3run1
子线程2run1
子线程2run2
子线程1run1
子线程2run3
子线程3run2
主线程run1
子线程3run3
子线程2run4
子线程1run2
子线程2run5
子线程3run4
主线程run2
子线程3run5
子线程1run3
主线程run3
子线程1run4
主线程run4
子线程1run5
主线程run5
三,
class myCal implements Callable<String> {
private int n;
public myCal(int n) {
this.n=n;
}
@Override
public String call() throws Exception {
long x=0;
for(int i=1;i<=n;i++){
x+=i;
}
return x+"";
}
}
public static void main(String[] args) {
myCal m1=new myCal(5);
FutureTask<String> ft1=new FutureTask<>(m1);
Thread t1=new Thread(ft1);
t1.start();
myCal m2=new myCal(10);
FutureTask<String> ft2=new FutureTask<>(m2);
Thread t2=new Thread(ft2);
t2.start();
try {
//get方法会等待该线程结束才会得到子线程信息
String s1=ft1.get();
System.out.println("子线程一 "+s1);
}catch (Exception e){
e.printStackTrace();
}
System.out.println("主线程");
try {
String s2=ft2.get();
System.out.println("子线程二 "+s2);
}catch (Exception e){
e.printStackTrace();
}
}
结果
子线程一 15
主线程
子线程二 55
总结