1.什么是多线程?
线程是操作系统能够进行运算调度的最小单位,而多线程就是在软件或者硬件上并发执行多个线程。简单来说:线程是程序中一个单一的顺序控制流程;而多线程就是在单个程序中同时运行多个线程来完成不同的工作。
之所以我们需要多线程,是为了能够解决负载均衡问题,充分利用CPU资源.为了提高CPU的使用率,采用多线程的方式去同时完成几件事情而不互相干扰.还能处理大量的IO操作时或处理的情况需要花费大量的时间等等。
2.java中如何实现多线程?
①继承Thread类
当我们继承了Thread类之后,我们必须要重写它的run()方法。
class MyThread extends Thread{
@Override
public void run() {
Thread.currentThread().setName(name);
System.out.println("I am Thread :" +name);
}
}
在主函数中需要创建对象,然后调用它的start()方法。
public class Main {
public static void main(String[] args) {
//实例化继承了Thread的类
MyThread thread1 = new MyThread();
//通过从Thread类中所继承的start()方法启动线程;
thread1.start();
}
}
②实现Runnable接口
当我们实现了Runnable接口之后,我们必须要重写它的run()方法。
public class MyThread implements Runnable {
@Override
public void run() {
System.out.println("Hi!");
}
}
在主函数中需要创建对象,然后调用它的start()方法。
public class Main {
public static void main(String[] args){
MyThread myThread=new MyThread();
Thread thread=new Thread(myThread);
thread.start();
}
}
③通过Callable和Future创建线程
-
创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。
-
创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。
-
使用FutureTask对象作为Thread对象的target创建并启动新线程。
-
调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。
public class Test implements Callable<Integer>{
public static void main(String[] args){
Test test= new Test();
FutureTask<Integer> future = new FutureTask<Integer>(test);
//开启future线程
for(int i = 0;i < 50;i++){
System.out.println(Thread.currentThread().getName()+" 的循环变量i的值"+i);
if(i==20){
//i为20的时候创建future线程
new Thread(future,"有返回值的线程FutureTask").start();
}
}
//future线程结束时,获取返回值
try{
System.out.println("子线程的返回值:"+future.get());//get()方法会阻塞,直到子线程执行结束才返回
} catch (InterruptedException e){
e.printStackTrace();
} catch (ExecutionException e){
e.printStackTrace();
}
}
public Integer call() throws Exception {
int i = 0;
for(;i<10;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
return i;
}
}
下面还有一个关于多线程的小案例:多窗口售票小案例(多线程)