继承Thread类
继承Thread类,重写里面的run()方法。启动线程调用类的start()方法。
不是调用run()方法,调用run()方法是普通的调用类的方法的过程,即先执行run()方法,在执行下面的语句,而调用start()方法是告诉cpu要执行run()方法,程序接着向下执行,具体run()方法什么时候执行,看cpu怎么分配
package ThreadClass;
/**
* 创建线程
* TODO
* @version 1.0
* @author 王星宇
*/
public class StartThread extends Thread{
@Override
public void run() {
for(int i = 0;i < 20;i++) {
System.out.println("听歌");
}
}
public static void main(String[] args) {
StartThread st = new StartThread();
st.start();//不保证立即运行
for(int i = 0;i < 20;i++) {
System.out.println("敲代码");
}
}
}
实现runnable接口
实现runnable接口,在启动线程时,要新建一个Thread类(因为一般这个Thread类只用一次,所以可以定义为匿名类),把实现runnable接口的类作为参数传进去,调用Thread类的start()方法。这里的Thread对象叫做静态代理。
因为java的单继承性,为了防止出现继承了Thread类不能继承其他类的情况出现,一般用实现runnable接口的方法来创建一个简单的线程
package ThreadClass;
/**
* 第二种实现多线程的方法
* TODO
* @version 1.0
* @author 王星宇
*/
public class StartThread2 implements Runnable{
@Override
public void run() {
for(int i = 0;i < 20;i++) {
System.out.println("听歌");
}
}
public static void main(String[] args) {
StartThread2 st2 = new StartThread2();
new Thread(st2).start();
for(int i = 0;i < 20;i++) {
System.out.println("写代码");
}
}
}
实现Callable接口
- 第三种方式很少用,麻烦,但是安全,一般用于大型项目。
- 实现Callable接口,泛型为call()方法的返回值。
- 在启动线程时,有四步(创建执行任务,提交执行,获取结果,关闭服务)
package ThreadClass;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* 第三种创建线程的方式
* TODO
* @version 1.0
* @author 王星宇
*/
public class StartThread3 implements Callable<Boolean>{
String name;
public StartThread3(String name) {
this.name = name;
}
@Override
public Boolean call() throws Exception {
for(int i = 0;i < 20;i++) {
System.out.println(name);
}
return true;
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
StartThread3 st31 = new StartThread3("听歌");
StartThread3 st32 = new StartThread3("写代码");
StartThread3 st33 = new StartThread3("看视屏");
//创建执行任务
ExecutorService ser = Executors.newFixedThreadPool(3);
//提交执行
Future<Boolean> result1 = ser.submit(st31);
Future<Boolean> result2 = ser.submit(st32);
Future<Boolean> result3 = ser.submit(st33);
//获取结果
boolean r1 = result1.get();
boolean r2 = result2.get();
boolean r3 = result3.get();
System.out.println(r1 + " " + r2 + " " +r3);
//关闭服务
ser.shutdownNow();
}
}