关于java多线程的回顾

现在想起来,多线程也是学了很久了,由于最近做到一个小游戏坦克大战中需要用来一些关于多线程的只是,所以现在想回顾一下之前学过的多线程的东西,废话少说,开始慢慢复习!
首先说说java的多线程,多线程是个很神奇的东西,它可以让一个进程(可以理解为一个程序)中同时存在多任务执行的情况,对于一个java程序来说,一个进程中至少有一个线程,那就是存在于main方法中的主线程,其实对于java程序来说,是不只一个线程的,例如还有负责java垃圾回收机制的线程,线程是进程中一个独立的控制单元,当进程中有多个线程在同时执行时,他们都持有cpu的执行权,CPU执行到谁,谁就开始执行,CPU是不能同时执行多个线程的,当然,多核CPU除外!在整个执行过程中,CPU一直在做着快速的切换。这是多线程的一个特性:随机性,通俗点说就是谁抢到了CPU的执行权,那么谁就开始执行。
那么,说到这里,既然某个时刻只有一个线程能运行,那么其他线程都处于什么状态呢?这里就必须得说说线程的五种状态了(有些书上说的是五种,有些书上说的是六种,但是其实原理是一样的,说六种的只是稍微细分了一下而已).
[线程状态图一览](https://img-blog.csdn.net/20150413195044558)
由图可以看出,当线程具备执行资格但是没有执行权时,那么它处于一种阻塞的状态。

那么说完了线程的基本概念,来说说线程的创建方式,线程有两种创建的方式,第一种:继承Thread类,并且覆盖run方法,代码如下:

public class ThreadDemo{
    public static void main(String[] args){
        Thread1 t = new Thread1();
        t.start();

        for(int i = 0;i<100;i++){
            System.out.println("主线程启动");
        }
    }
}
class Thread1 extends Thread{
    public void run(){
        for(int i = 0;i < 100;i++){
            System.out.println("线程1启动");
        }
    }
}

这个小程序运行之后会发现,每次都会有不同的结果,这就验证了CPU一直在各线程之间来回切换这一点。
在这个小程序中,可能初学者会有许多问题,问题1:
为什么要覆盖run方法呢?
Thread类用于描述线程,其中run方法的作用是存储该线程需要运行的自定义程序代码.就好像main方法中存储着主线程需要运行的代码一样!
问题2:start方法的作用是什么?
1.启动线程
2.调用run方法

下面是创建线程的第二种方式,实现Runnable接口,代码如下:模拟卖票的一个小程序

public class TicketDemo{
    public static void main(String[] args){
        Ticket t = new Ticket();//创建一个Ticket对象
        //将Ticket对象作为参数传入创建的四个线程中,实现车票数据的共享
        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);
        Thread t3 = new Thread(t);
        Thread t4 = new Thread(t);
        //将四个线程分别启动
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}
class Ticket implements Runnable{
    private int ticket = 100;
    //覆盖接口中的run方法
    public void run(){
        for(int i = 1;i<ticket;i++){
            System.out.println(Thread.currentThread().getName()+"sale...."ticket--);
        }
    }
}

上面的这个小程序说明了实现Runnable接口的创建线程的方法,需要说明的是如果用第一种方法创建
线程来实现这个卖票的小程序是行不通的,因为第一种采用继承的方式来创建线程,不能实现车票数
据的共享,那样的话创建四个线程意味着每个线程卖一百张票。一共是卖400张票!
到这里,要说下继承与实现的区别:
继承Thread类:线程代码存放在Thread子类的run方法中
实现Runnable接口:线程代码存放在Runnable子类的run方法中
实现的好处:避免的单继承的局限性。所以在定义线程时,一般都使用第二种方式来创建线程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章