1.线程的生命周期
2.创建线程的方式,继承Thread和实现Runnable接口
package it.com.cn.thread;
public class ThreadCreate {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
System.out.println("主线程结束"+Thread.currentThread().getName());
/**
* 实现Runnable接口
*/
Runnable r1 = ()->{
for (int i = 0; i <10 ; i++) {
System.out.println("线程实现Runnable接口"+i);
}
};
new Thread(r1).start();
}
}
/**
* 继承Thread类
*/
class MyThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("子线程==="+currentThread().getName()+i);
}
}
}
实现callable接口依赖FutureTask,类关系图如下
package it.com.cn.thread;
import java.util.Date;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"时间=="+new Date().getTime()+"循环次数==="+i);
}
return "MyCallable接口执行结束";
}
public static void main(String[] args) {
FutureTask<String> futureTask = new FutureTask<String>(new MyCallable());
Thread thread = new Thread(futureTask,"MyCallable");
thread.start();
try {
String s = futureTask.get();
System.out.println(s);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
几种方式对比
线程资源安全问题
synchronized和ReenreantLock区别
线程通讯比较