在java中要实现多线程就必须依赖一个主体类,该类可以是继承Thread类、实现Runnable接口、实现Callable接口。
方式一:继承Thread类
任何类只要继承了Thread类就可以成为线程类,在此类中一定要重写run()方法,用线程类创建若干线程对象后,启动线程所执行的就是run()方法中的代码。
class MyThread extends Thread {
private String name;
public MyThread(String name) {
this.name = name;
}
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println(name + ":" + i);
}
}
}
public class text {
public static void main(String[] args) {
//创建线程对象
Thread t1 = new MyThread("线程A");
Thread t2 = new MyThread("线程B");
//启动线程
t1.start();
t2.start();
}
}
方式二:实现Runnable接口
使用Thread类可以很方便的实现多线程,缺点是单继承的局限性。为克服这一缺点可以实现Runnable 接口实现多线程。
其实Thread类也是实现了Runnable接口属于Runnable的子类,其启动线程的方法start()属于Thread类的特有方法。通过实现Runnable接口方式创建线程对象就无法使用start()方法来启动线程。不过没有关系Thread类提供了一个构造器---publie Thread(Runnable target),通过该构造器可以将Runnable计科创建的线程对象进行包裹,从而可以来使用Thread类中特有的start()方法。
class MyThread implements Runnable {
private String name;
public MyThread(String name) {
this.name = name;
}
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println(name + ":" + i);
}
}
}
public class text {
public static void main(String[] args) {
//创建线程对象,对Runnable实现对象进行包裹
Thread t1 = new Thread(new MyThread("线程A"));
Thread t2 = new Thread(new MyThread("线程B"));
//启动线程
t1.start();
t2.start();
}
}
因为Runnable属于函数式接口,可以使用Lambda表达式进行定义线程方法
public class text {
public static void main(String[] args) {
new Thread(()->{
System.out.println("线程启动");
}).start();
}
}
方式三:实现Callable接口
?突出优点:利用实现Callable接口形式创建的线程对象可以返回执行结果。
class MyThread implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("线程代码~");
return "结果返回";
}
}
public class text {
public static void main(String[] args) throws Exception {
FutureTask<String> t = new FutureTask<>(new MyThread());
new Thread(t).start(); //执行线程
String rs = t.get(); //返回结果
System.out.println(rs);
}
}
|