什么是多线程
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”。
个人理解:
就是一个程序他有多个子程序,当一个子程序阻塞的时候,CPU可以不离开这个程序,去执行他的另一个子程序,这样可以大幅度提升CPU在本程序的运行效率。
这其中,每一个子程序叫做一个线程。所以叫做多线程
多线程的基本实现
多线程有两种实现方式:
一:继承Thread类
二:实现Runnable接口
需要注意的是,JAVA有且仅有这两种实现多线程的方法
下面是实现多线程的代码:
public class Main {
public static void main(String[] args) {
thread a = new thread();
a.start();
Thread b = new Thread(new thread2());
b.start();
}
}
//继承Tread类
public class thread extends Thread{
public void run() {
System.out.println("hello");
}
}
//实现Runnable接口
public class thread2 implements Runnable{
public void run() {
System.out.println("hello!");
}
}
代码运行结果:
hello
hello!
注意点:
1.要调用start方法来运行run方法才是并行执行(也就是两个子程序交替执行),如果直接调用run方法是串行执行的(先执行其中一个子程序,再去执行另一子程序,这样就不是多线程运行了)
2.同一个线程,只能start一次,不然会报错
3.多个线程同时启动,其中的执行顺序是不确定的。
3.main函数可能比线程结束的早,但是程序并不跟着main函数的结束而结束,会根据线程的结束而结束。
多线程信息共享
目前为止,我们定义的线程之间是基本没有什么交流的(粗粒度),我们想实现线程和线程之间和线程和主函数之间有着紧密的信息交流(细粒度),这样可以使得我们的程度实现更多的需求。
但是,现在的问题在于如何克服工作缓存。
那什么是工作缓存呢?
我们来看看我们熟知的i++是如何工作的:
所以当我们的线程在运行想要获取一个变量的时候,另一个程序也在更改这个变量,他取出的可能是还没有刷新的主存,也就是很不及时!还可能这个变量在被修改的时候,有不止一个其他线程用了这个还没背刷新的变量,会使得程序向错误的方向运行。
变量副本的解决问题
采用volatile关键字来修饰变量
它可以保证不同线程对共享变量操作的时候的可见性
加锁问题
加锁就是使得这个代码块或者函数只能同时被一个线程所运用;
下面这个例子是有一百张票,有三个线程同时买票:
public class Main {
public static void main(String[] args) {
ti aTi = new ti();//创建三个线程
new Thread(aTi).start();
new Thread(aTi).start();
new Thread(aTi).start();
}
}
package lsq1;
class ti implements Runnable{
private volatile int tickets=100;
private volatile int now=0;
public void run() {
while(true) {
sell();
try { //程序睡眠
Thread.sleep(10);
}catch (Exception e) {
System.out.println(e.getMessage());
}
if(tickets<=0)
break;
}
}
public synchronized void sell() { //卖票
if(tickets>0)
{
tickets--;
now++;
System.out.println(Thread.currentThread().getName()+" is selling ticket "+now);
}
}
}
运行结果:
直到100张票为止(太长了就不截图了)
我们可以知道,现在这三个进程买票是一共一百张,不是各卖各的。
多线程管理
JAVA中有对多线程管理的一些方法: