1、继承Thread类,通过start()方法调用
public class MultiThreadByExtends extends Thread {
@Override
public void run() {
print("听歌");
}
public static void print(String threadName){
while (true) {
System.out.println("线程:"+threadName+" 输出。。。");
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public static void main(String[] args) {
MultiThreadByExtends t1 = new MultiThreadByExtends();
t1.start();
print("写代码");
}
}
输出结果:
线程:写代码 输出。。。
线程:听歌 输出。。。
线程:写代码 输出。。。
线程:听歌 输出。。。
线程:写代码 输出。。。
线程:听歌 输出。。。
线程:听歌 输出。。。
由于java单继承的特点,这种方式局限性很大,不能继承其他父类
2、实现Runable接口
public class MultiThreadByRunnable implements Runnable {
@Override
public void run() {
print("听歌");
}
public static void print(String threadName){
while (true) {
System.out.println("线程:"+threadName+" 输出。。。");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public static void main(String[] args) {
MultiThreadByRunnable tr1 = new MultiThreadByRunnable();
//代理方式启动
Thread thread = new Thread(tr1);
thread.start();
print("写代码");
}
}
输出结果:
线程:写代码 输出。。。
线程:听歌 输出。。。
线程:写代码 输出。。。
线程:听歌 输出。。。
线程:听歌 输出。。。
线程:写代码 输出。。。
线程:听歌 输出。。。
线程:写代码 输出。。。
3、实现callable接口
import java.util.concurrent.*; public class CallableTest implements Callable<Boolean> {
@Override
public Boolean call() throws Exception {
int count = 0;
while (true){
System.out.println("1111");
Thread.sleep(1000);
count++;
if(count >10) {
break;
}
}
return true;
} public static void main(String[] args) throws ExecutionException, InterruptedException { CallableTest c = new CallableTest();
ExecutorService es = Executors.newFixedThreadPool(1);
Future<Boolean> res = es.submit(c);
System.out.println(res.get());
es.shutdownNow();
}
}
该方式的优点是可以得到线程的返回值
平时开发中常用到的就是1、2两种方式,至于第三种,属于JUC里面的东西,如果在面试中能答上来,对初级或中级java面试来说绝对是加分项