java 多线程

Java VM 启动的时候会有一个java.exe

该进程中至少有一个线程负责java程序的执行,而且这个线程运行的代码存在于main()方法中,该线程称为主线程。

jvm启动不止一个线程,还有负责垃圾回收机制的线程。

自定义线程:

    继承Thread类,复写run方法,创建对象,start调用。

run方法用于存储线程要运行的代码。

调用run()和start()方法的区别,run只是简单的对象调用方法,创建了线程没有运行,start()是开启线程运行代码。

线程运行状态:

 

 

 获取线程对象名称:Thread.currentThread().getName()

Thread.currentThread()      this

currentThread():获取当前线程对象  

getName():获取线程名称

创建线程的第二种方法:

实现Runnable接口

1.定义类实现Runnable接口  

2.覆盖Runnable接口中的run方法  

3.通过Thread建立线程对象  

4.将Runnable接口的子类对象作为实际参数传递给Thread类的构造方法  

5.调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。

案例卖票:

多个窗口提示售票,但是不能重复售票

方法一:总的票数不变,共享总票数。

class Ticket extends Thread{
    private static int tick=100;
    @Override
    public void run() {
        while (true){
            if (tick>0){
                System.out.println(currentThread().getName()+"...sale:"+tick--);
            }
        }
    }
}
public class Demo {
    public static void main(String[] args) {
        Ticket t1 = new Ticket();
        Ticket t2 = new Ticket();
        t1.start();
        t2.start();
    }
}

方法二:通过接口方式(推荐)

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

区别:

继承Thread方法线程代码存放在Thread子类的run方法中。

实现Runnable线程代码存放在接口的子类的run方法中。

 

posted @ 2020-03-24 21:56  hongxiao2020  阅读(204)  评论(0)    收藏  举报