1.什么是线程
在讲解线程前让我们了解一下进程是什么
进程:在操作系统中每一个独立执行的程序都可以被称为一个进程,也就是正在运行的程序,我们可以同时按下CTRL+shift+esc打开任务管理器,便可以看到电脑正在运行的进程。
线程
在一个进程中还可以有多个执行单元同时运行,这些执行单元可以看作程序执行的一条条线索,称为线程
2.线程的创建
Java中提供了两种多线程实现方法fangfa
1.第一种是继承java.lang包下的Thread类,重写Thread类的run()方法,在run()方法中实现运行在线程上的代码
1.在学习多线程前线熟悉一下单线程,便于我们比较学习
public class Example01 {
public static void main(String[] args){
MyThread myThread = new MyThread();
myThread.run();
while(true){
System.out.println("main方法正在运行");
}
}
}
class MyThread {
public void run(){
while(true){
System.out.println("MyThread类的run()方法在运行");
}
}
}
单线程结果
单线程注解:由于此代码并没有实现多线程,所以当代码运行到run()方法时由于此方法中存在死循环,导致代码不能运行下面的代码
2.接下来我们学习实现多线程的第一种方法
public class Example02 {
public static void main(String[] args){
MyThread1 myThread1 = new MyThread1();
myThread1.start();
while(true){
System.out.println("main方法正在运行");
}
}
}
class MyThread1 extends Thread{
public void run(){
while(true){
System.out.println("MyThread类的run()方法在运行");
}
}
}
运行结果
多线程方法一注解:
代码中继承了Thread类,实现了多线程,这时虽然代码run()方法中是死循环,结果中依然出现了下面代码的结果,这便体现了多个线程可以同时进行的特点
2.实现java.lang.Runnable接口,同样是在run()方法中实现运行在线程的代码
public class Example03 {
public static void mian(String[] args){
MyThread3 myThread3 = new MyThread3();
Thread thread = new Thread(myThread3);
thread.start();
while(true){
System.out.println("main方法正在运行");
}
}
}
class MyThread3 implements Runnable{
public void run(){
while(true){
System.out.println("MyThread正在运行run()方法");
}
}
}
运行结果
多线程方法二注解:代码中通过实现Runnable接口实现了多线程,同样得到了和方法一相同的结果
3.两种实现多线程方法的对比分析
下面通过一中场景来分析
假设售票厅有4个窗口可发售某日某车的100张车票,这100张票可以看成共享资源,4个窗口需要创建四个线程。
方法一实现如下
public class Example04 {
public static void main(String[] args){
new TicketWindow().start();
new TicketWindow().start();
new TicketWindow().start();
new TicketWindow().start();
}
}
class TicketWindow extends Thread{
private int ticket = 100;
public void run(){
while(true){
if(ticket>0){
Thread th = Thread.currentThread();
String th_name = th.getName();
System.out.println(th_name+"正在发售第"+ticket-- +"张票");
}
}
}
}
运行结果如下
结果注解:很明显结果中出现了四个窗口分别卖出了同一张票,由此我们可以得知这里的4个线程并没有共享100张票这一资源
方法二实现如下
public class Example05 {
public static void main(String[] args){
TicketWindow1 tw = new TicketWindow1();
new Thread(tw,"窗口一").start();
new Thread(tw,"窗口二").start();
new Thread(tw,"窗口三").start();
new Thread(tw,"窗口四").start();
}
}
class TicketWindow1 implements Runnable{
private int ticket = 100;
public void run(){
while(true){if(ticket>0){
Thread th = Thread.currentThread();
String th_name = th.getName();
System.out.println(th_name+"正在发售第"+ticket-- +"张票");
}}
}
}
运行结果注解:结果中很显然是四个窗口共同将100张票卖出,四个进程是共享了100张票这一资源的
分析结论:通过两方法对比可以得出方法二可以使多线程对资源共享,而方法一却不能