public class ThreadDemo01 {
public static void main(String[] args) {
MyThread myThread1 = new MyThread();
myThread1.start();
for (int i = 0; i < 3; i++) {
System.out.println("主线程正在执行~~");
}
}
}
class MyThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println("子线程正在执行~~");
}
}
}
//输出结果(不唯一):
//主线程正在执行~~
//主线程正在执行~~
//主线程正在执行~~
//子线程正在执行~~
//子线程正在执行~~
//子线程正在执行~~
public class ThreadDemo02 {
public static void main(String[] args) {
MyRunnable target = new MyRunnable();
Thread thread = new Thread(target);
thread.start();
for (int i = 0; i < 3; i++) {
System.out.println("主线程正在执行~~");
}
}
}
class MyRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println("子线程正在执行~~");
}
}
}
//输出结果(不唯一):
//主线程正在执行~~
//子线程正在执行~~
//子线程正在执行~~
//子线程正在执行~~
//主线程正在执行~~
//主线程正在执行~~
//正常版:
public class ThreadDemo01 {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println("子线程正在执行~~");
}
}
});
thread.start();
for (int i = 0; i < 3; i++) {
System.out.println("主线程正在执行~~");
}
}
}
//lambda简化版:
new Thread(()-> {
for (int i = 0; i < 3; i++) {
System.out.println("子线程正在执行~~");
}
}).start();
public class ThreadDemo03 {
public static void main(String[] args) throws Exception {
MyCallable myCallable = new MyCallable();
FutureTask<String> futureTask = new FutureTask<>(myCallable);
Thread thread = new Thread(futureTask);
thread.start();
int sum= 0;
for (int i = 0; i < 3; i++) {
sum+=i;
}
System.out.println(sum);
String s =futureTask.get();
System.out.println(s);
}
}
class MyCallable implements Callable<String > {
@Override
public String call(){
int sum=0;
for (int i = 0; i < 3; i++) {
sum+=i;
}
return "子线程计算结果:"+sum;
}
}
//输出结果:
//3
//子线程计算结果:3
ログイン後にコピー
方式三优缺点:
优点:
线程任务类只是实现接口,可以继续继承类和实现接口,扩展性强;
可以在线程执行完毕后去获取 线程执行的结果;
缺点:
编码复杂一点;
总结
方式
优点
缺点
继承Thread类
编程比较简单,可以直接使用Thread类中的方法
扩展性较差,不能再继承其他的类,不能返回线程执行的结果
实现Runnable接口
扩展性强,实现该接口的同时还可以继承其他的类
编程相对复杂,不能返回线程执行的结果
实现Callable接口
扩展性强,实现该接口的同时还可以继承其他的类,可以得到线程的执行结果
编程相对复杂
常用方法
Thread获取和设置线程名称
方法名称
说明
String getName()
获取当前线程的名称,默认线程名称是Thread-索引
void setName(String name)
将此线程更改为指定的名称,通过构造器也可以设置线程名称
简单地通过一段代码让大家能够清晰地了解这个代码该如何使用:
public class ThreadDemo04 {
public static void main(String[] args) throws Exception {
thread thread1 = new thread();
thread1.setName("1号子线程");
thread1.start();
thread thread2 = new thread();
thread2.setName("2号子线程");
thread2.start();
}
}
class thread extends Thread {
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println(this.getName()+"正在执行任务"+i);
}
}
}
//输出结果:
//2号子线程正在执行任务0
//1号子线程正在执行任务0
//2号子线程正在执行任务1
//1号子线程正在执行任务1
//2号子线程正在执行任务2
//1号子线程正在执行任务2
ログイン後にコピー
Thread类的线程休眠方法
方法名称
说明
public static void sleep(long time)
让当前线程休眠指定的时间后再继续执行,单位为毫秒
public class ThreadDemo05 {
public static void main(String[] args) throws Exception {
for (int i = 0; i < 5; i++) {
System.out.println(i);
if (i==3){
Thread.sleep(5000);
}
}
}
}
//输出结果:
//1
//2
//3
//在输出过3以后,等待5秒之后再进行输出
//4