多线程
1.线程是指程序在程序过程中,能够执行程序代码的一个执行单元。
会处于运行,就绪,挂起和结束。
2.线程是程序执行的最小单元,一个进程可以拥有很多个线程,各个线程之间共享程序的内存空间(代码段,数据段,堆空间)及一些进程间的资源(如打开的文件),各个线程拥有自己的栈空间。
3.使用多线程的原因:
①.使用多线程可以减少程序的响应时间。
②.与进程相比,线程的创建和切换开销更小
③.多CPU或多核计算机本身就具有执行多线程的能力,如果使用单个线程,将无法重复利用计算机资源,造成资源的巨大浪费。
④.使用多线程可以简化程序的结构,使程序便于理解和维护。
同步和异步
同步:当多个线程需要同时访问同一资源时,他们需要以某种特定的顺序来保证该资源在同一时刻只能被一个线程访问。
注:实现同步机制
获取每个线程的对象锁,在同一时刻只有一个线程进入临界区,当获得该临界区资源的对象释放锁退出临界区,在队列中的优先级高的线程才可获取临界区资源。
1.利用同步代码块实现同步
2.利用同步方法实现同步
异步:每个线程都包含了运行时自身需要的资源和方法,比如在进行输入输出时,不必关心其他的线程的状态和行为。
多线程的实现
1.继承Thread类,重写run方法。
class MyThread extends Thread{
public void run{
System.out.println(“This is Body”);//线程的函数体
}
}
public class Test{
public static void main(String []args){
MyThread thread=new MyThread();
thread.start();//开启线程;
}
}
2.实现Runnable接口,重写run方法。
class MyThread implements Runnable{
public void run(){
System.out.println("This is Body");//线程函数体
}
}
public class Test{
public static void main(String []args){
MyThread thread=new MyThread();
Thread t=new Thread(thread);
t.start();//开启线程
}
}
3.实现Callable接口,实现call方法。
import java.util.concurrent.*;
//创建线程类
public class CallableTest implements Callable<String>{
public Strng call() throws Exception{
return "Hello World";
}
}
public class CallableAndFuture{
public static void main(String []args){
ExecutorService thredPool=Executors.newSingleThredExecutor();
//启动线程
Future<String> future=threadPool.submit(new CallableTest);
try{
System.out.println("waiting thread to finish");
System.out.println(future.get());//等待线程结束,并获取返回结果
}catch(Exception e){
e.printStackTrace();
}
}
}