Java重修之路(十二)初识Java线程

来源:互联网 发布:自动化与人工智能 编辑:程序博客网 时间:2024/04/20 13:14

Java线程

- 线程初识

CPU在某一时刻只能执行一向任务,当有多个任务时,CPU在多个任务之间快速切换。
进程是一个正在执行执行中的程序,。
线程是程序的控制单元,线程控制着进程的执行。
JVM启动的时候会有一个进程 java.exe 该进程中至少有一个线程负责java程序的运行,而且这个线程运行的代码存在于main方法中,该线程称之为主线程。

看一个小例子:

public class MyThread extends Thread {    @Override    public void run() {        super.run();        for (int i = 0; i < 100; i++) {            System.out.print("子线程执行" + i+"\t");        }    }}
public class Test {    public static void main(String[] args) {        MyThread th = new MyThread();        th.start();        for (int i = 0; i < 100; i++) {            System.out.print("Main0" + i + "\t");        }    }}

在主函数中首先有一个主线程,然后在主线程中开启了子线程,然后看运行结果:

Main00 子线程执行0 子线程执行1 Main01 子线程执行2 Main02 子线程执行3 Main03 子线程执行4 Main04 子线程执行5 Main05 子线程执行6 Main06 子线程执行7 Main07 子线程执行8 Main08 子线程执行9 Main09 子线程执行10 Main010 子线程执行11 Main011 子线程执行12 Main012 子线程执行13 Main013 子线程执行14 Main014 子线程执行15 Main015 子线程执行16 Main016 子线程执行17 Main017 子线程执行18 Main018 Main019 Main020 Main021 Main022 子线程执行19 Main023 子线程执行20 Main024 子线程执行21 Main025 子线程执行22 Main026 子线程执行23 Main027 子线程执行24 Main028 子线程执行25 Main029 子线程执行26 Main030 子线程执行27 Main0


只是截取了部分运行结果,可以看到两个线程交叉运行,并不是一个执行完毕再执行另一个。CPU在快速切换。
这个程序每次运行的结果是不同的
在某一时刻只能有一个程序运行(多核除外)

这里写图片描述

run方法其实是用来保存需要执行的代码,然后在start中调用。

  • 区分run和start的区别:
public class Test {    public static void main(String[] args) {        MyThread th = new MyThread();        th.run();        System.out.println("-----------------------");        for (int i = 0; i < 100; i++) {            System.out.println("Main0" + i);        }    }}

这里跟上边比只是将 th.start();改成了th.run();
执行结果:

这里写图片描述

可以看出,这里run方法先执行完毕,然后才继续往下边走。
这是因为
MyThread th = new MyThread();
th.run();
只是创建了线程,并没有执行,仅仅是对象调用方法,所以必须是run方法执行完毕才会继续往下边执行。

  • 线程的几种状态

    这里写图片描述


  • 售票的例子:
public class MyThread extends Thread {    private static int ticket = 100;    public void run() {        while (true) {            if (ticket > 0) {                System.out.println(Thread.currentThread().getName() + ".....sale...." + ticket--);            }        }    }}
public class Test {    public static void main(String[] args) {        MyThread t1 = new MyThread();        MyThread t2 = new MyThread();        MyThread t3 = new MyThread();        t1.start();        t2.start();        t3.start();    }}三个线程同时售票,主要要将ticket数量用静态修饰,否则会卖出重复的票。

实现 Runnable接口:

public class MyThread implements Runnable {    private int ticket = 100;    public void run() {        while (true) {            if (ticket > 0) {                System.out.println(Thread.currentThread().getName() + ".....sale...." + ticket--);            }        }    }}
public class Test {    public static void main(String[] args) {        MyThread t = new MyThread();        Thread t1 = new Thread(t);        Thread t2 = new Thread(t);        Thread t3 = new Thread(t);        t1.start();        t2.start();        t3.start();    }}

这里写图片描述

实现线程的两种方法区别:
1.继承Thread:线程代码存放在Thread子类的run方法中
2.实现Runnable接口,线程代码存放在接口的子类的run方法中。
推荐使用实现接口的方法,避免了单继承的局限性

0 0
原创粉丝点击