一、线程和进程
线程和进程的区别是啥呢?
一个进程就好比打开一个软件应用,但这个软件应用可能含有多个线程。
当然也有可能打开一个软件应用会同时进行多个进程,每个进程也有可能有多个线程。
二、多线程的几种方式
一般来说面试时会问多线程的三种方式分别是什么:
1、继承Thread类
2、实现Runnable接口
3、实现Callable接口
有时面试官也会问多线程的四种方式分别是什么:
那第四种方式就是线程池方式。
三、继承Thread类方式
package day1112;
// 继承Thread类
// 重写run方法
// 创建Thread子类对象
// 调用start方法
public class Runner1 extends Thread {
//重写run方法
@Override
public void run(){
for(int i = 0;i<10;i++)
System.out.println("Runner hello world !"+i);
}
public static void main(String[] args) {
Runner1 r = new Runner1();
r.start();//多线程调用
r.run();//方法调用
for(int i = 0;i<10;i++){
System.out.println("main"+i);
}
}
}
四、实现Runnable接口
package day1112;
//实现Runnable接口
//重写run方法
//创建实现类对象
//创建Thread对象,Runnable对象作为构造方法的实参
//调用start()方法
public class Runner2 implements Runnable{
@Override
public void run(){
for(int i = 0;i<10;i++) {
System.out.println("runner"+i);
}
}
public static void main(String[] args) {
Runner2 r = new Runner2();
Thread t = new Thread(r);
t.start();
for(int i = 0;i<10;i++){
System.out.println("main方法"+i);
}
}
}
五、实现Callable接口
package day1112;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
//实现callable接口
//重写call方法
//创建Callable子类的实现类对象
//创建FutureTask对象,Callable对象作为构造方法实参
//创建Thread对象,FutureTask对象作为构造方法实参
//调用start()方法
class Testing{
public static void main(String[] args) throws ExecutionException, InterruptedException {
Runner3 r1 = new Runner3();
Runner3 r2 = new Runner3();
FutureTask ft1 = new FutureTask(r1);
FutureTask ft2 = new FutureTask(r2);
Thread t1 = new Thread(ft1);
Thread t2 = new Thread(ft2);
t1.start();//t1.start();//一个线程重复调用start方法编译器通过,运行期报异常IllegalThreadStateException
t2.start();
Integer a1 = (Integer) ft1.get();
Integer a2 = (Integer) ft2.get();
System.out.println("a1="+a1);
System.out.println("a2="+a2);
}
}
public class Runner3 implements Callable<Integer> {
private int number = 20;
@Override
public Integer call() throws Exception{
int result;
while(number >0){
System.out.println("还有雪地:"+number+"平方米未清扫");
number --;
}
return number;
}
}