Java多线程
一、进程与线程
首先我们需要理解,什么是线程、什么是进程?
在日常生活中,许多事情可以同时进行,例如一个人可以同时听课、玩游戏、甚至是写高数。在应用程序中,不同的程序块也是可以同时运行的,这种多个程序块同时运行的现象被称作并发执行。
那么,什么是进程呢?简单地说,每一个运行中的程序都是一个进程。什么是线程呢?每个进程都需要至少一条执行线索去执行相应的功能,这条“线索”可以被称作线程,如最简单的情况就是,一个java程序只有一个main方法,这个main方法就是一条执行线索,就是一个线程。当然,这样的执行效率不高,我们需要多个执行线索去执行我们的程序,由此衍生出多线程。
二、并发与串行
在生活中,大家去商城买东西,大家可以同时进行购物,这就是并发执行,而在结账时,大家需要排队吧,一个人结完账后再到另一个人结账,这个时候就是串行执行。
三、线程安全问题:
如上面的例子,一坨人一起买东西会产生不安全的现象,如偷东西,因为我们无法监管到每一个人,不能保证每个人都是像作者这样的优秀四有青年,这就是并发安全问题,这时候要“上锁”,简单地说就是串行化,让一个人接着一个人去买,里边有人监督这个人,这个人买完了就去结账,该回家回家,该去哪去哪,而下一个人在接着重复这样的动作,就能避免并发安全。
三、什么是多线程
多线程就是指一个应用程序中可以有许多并发执行的线索,每条线索都被称之为一个线程。
四、线程的创建
第一种方式:用自定义线程去继承Thread类,然后再调用它
public class MyThread extends Thread{
//重写run方法,方便被调用
@Override
public void run() {
for(int i = 0;i < 10;i++){
System.out.println("MyThread线程正在执行...");
}
}
public class ThreadTest {
public static void main(String[] args) {
//创建MyThread这个线程
MyThread myThread = new MyThread();
//启动这个线程中的run方法
myThread.start();
//用main线程输出一条语句
for(int i = 0;i < 10;i++){
System.out.println("main线程正在执行...");
}
}
}
输出的结果:
可以发现,主线程和MyThread线程是同时执行的,如果不使用多线程,而是使用单线程,如下:
public class ThreadTest {
public static void main(String[] args) {
//创建MyThread这个对象
MyThread myThread = new MyThread();
//启动这个线程中的run方法
myThread.run();
//用main线程输出一条语句
for(int i = 0;i < 10;i++){
System.out.println("main线程正在执行...");
}
}
}
在代码中我们仅把MyThread这个类当做普通类来使用,我们会发现程序会顺序执行,即当MyThread的run方法执行完后,才会继续执行main这个线程的输出方法
第二种实现方式:让自定义线程类去实现Runnable接口,并实现run方法
以下是经典的购票例子
public class TicketThread extends Thread{
//定义100张票
private Integer tickets = 100;
@Override
public void run() {
while(tickets > 0){
//获取当前线程的名字
String current_thread = Thread.currentThread().getName();
//模拟售票
System.out.println(current_thread+"正在出售第"+tickets--+"张票");
}
}
}
public class BuyTicketsTest {
public static void main(String[] args) {
TicketThread tr = new TicketThread();
//创建5个TicketThread线程并命名,开启并执行线程
new Thread(tr,"窗口1").start();
new Thread(tr,"窗口2").start();
new Thread(tr,"窗口3").start();
new Thread(tr,"窗口4").start();
new Thread(tr,"窗口5").start();
}
}
从执行结果中我们可以看到,线程之间互不干扰,各自执行。