多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。
进程
是系统执行资源分配和调度的独立单位
每一进程都有属于自己的存储空间和系统资源
注意:进程A和进程B的内存独立不共享。
线程
单线程:一个进程中包含一个顺序控制流(一条执行路径)
多线程:一个进程中包含多个顺序控制流(多条执行路径)
在java语言中:
线程A和线程B,堆内存和方法区内存共享。
但是栈内存独立,一个线程一个栈。
假设启动10个线程,会有10个栈空间,每个栈和每个栈之间,互不干扰,各自执行各自的,这就是多线程并发。
java中之所以有多线程机制,目的就是为了提高程序的处理效率。
对于单核的CPU来说,不能够做到真正的多线程并发,但是可以做到给人一种“多线程并发”的感觉。对于单核的CPU来说,在某一个时间点上实际上只能处理一件事情,但是由于CPU的处理速度极快,多个线程之间频繁切换执行,跟人来的感觉是多个事情同时在做。
多线程实现方式
继承Thread类
1、自定义一个类MyThread类,用来继承与Thread类
2、在MyThread类中重写run()方法
3、在测试类中创建MyThread类的对象
4、启动线程
/*
类继承 Thread 就表明该类是一个线程
需要重写runf方法,该方法就是多线程要执行的功能
*/
public class The1 extends Thread {
public void run(){
for (int i=0;i<100;i++){
System.out.println("执行听歌'鸡你胎没'"+i);
}
}
}
public class The2 extends Thread {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("执行任务'绿尸寒警告'"+i);
}
}
}
public class The3 {
public static void main(String[] args) {
//实例化线程类的对象
The1 t1 = new The1();
The2 t2 = new The2();
//启动线程,实现了多线程任务,多个任务交替执行
t1.start();
t2.start();
}
}
多线程的实现方式(二)
实现Runnable接口
1、自定义一个MyRunnable类来实现Runnable接口
2、在MyRunnable类中重写run()方法
3、创建Thread对象,并把MyRunnable对象作为Tread类构造方法的参数传递进去
4、启动线程
用卖电影票来演示
public class There1 implements Runnable{
//电影票的初始数量
private int ticket=10;
public void run(){
//获取当前程序对应执行线程的名称
String name=Thread.currentThread().getName();
while (true){
if(ticket>0){
//模拟卖票
System.out.println(name+"正在卖第"+ticket+"张票");
//模拟出票,需要一段时间
try {
Thread.sleep(100);
}catch (InterruptedException e){
throw new RuntimeException(e);
}
//把票的总数减一
ticket--;
}else {
break;
}
}
}
}
public class There2 {
public static void main(String[] args) {
There1 th1=new There1();
Thread t1=new Thread(th1,"小王");
Thread t2=new Thread(th1,"小美");
t1.start();
t2.start();
}
}
我们可以看到有大量的票数重复,解决方法也很简单,只用加两行代码就可以了
public class There1 implements Runnable{
//电影票的初始数量
private int ticket=10;
Object lock=new Object();
public void run(){
//获取当前程序对应执行线程的名称
String name=Thread.currentThread().getName();
while (true){
synchronized (lock){
if(ticket>0){
//模拟卖票
System.out.println(name+"正在卖第"+ticket+"张票");
//模拟出票,需要一段时间
try {
Thread.sleep(100);
}catch (InterruptedException e){
throw new RuntimeException(e);
}
//把票的总数减一
ticket--;
}else {
break;
}
}
}
}
}