欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

通过线程解决实际问题

程序员文章站 2022-07-12 17:08:00
...
class Ticket extends Thread {
     static int num = 50;

    public void run() {
        while (true) {
            if (num > 0) {
                System.out.println(Thread.currentThread().getName() + "---" + num);
                num--;
            }
            else{
                break;
            }
        }
    }
}

class Demo {
    public static void main(String[] args) {
        Ticket t = new Ticket();
        Ticket t2 = new Ticket();
        Ticket t3 = new Ticket();
        Ticket t4 = new Ticket();
        t.start();
        t2.start();
        t3.start();
        t4.start();

    }
}

现实生活中,我们去火车站买票,多个窗口同时进行买票,直到所有的票卖完为止,我用static修饰num是让所有线程共享一个数据,我用一个死循环目的是想让开启的线程一旦执行就一直执行下去,但是别忘了跳出循环,刚开始我忘了break,电脑卡了,看来一下任务管理器,cpu占用百分之百。还好我退出的快,不然cpu就爆掉了。
但是线程存在许多安全问题。下面要进行讲解:

class Ticket extends Thread {
     static int num = 50;

    public void run() {
        while (true) {
            try{
                Thread.sleep(5);
            }
            catch(InterruptedException e){
                
            }
            if (num > 0) {
                System.out.println(Thread.currentThread().getName() + "---" + num);
                num--;
            }
        
        }
    }
}

class Demo {
    public static void main(String[] args) {
        Ticket t = new Ticket();
        Ticket t2 = new Ticket();
        Ticket t3 = new Ticket();
        Ticket t4 = new Ticket();
        t.start();
        t2.start();
        t3.start();
        t4.start();

    }
}

在api文档中,对Thread类进行描述,sleep是其控制cpu停留时间的东西,但他是一个异常,需要进行捕获,内部消化。你会发现运行结果有些出人意料,数字开始重复,有时开始出现负数,那是因为当四个线程开始执行时,进入循环,它们都会因为sleep停留一下,之后cpu将一个执行完的线程切走后,另外几个线程紧接着减一,这就造成数据的不连续。造成数据的重复是因为cpu的切换,在线程中还没有减一就被cpu切到另外一个线程去了。

线程的第二种定义方式

class Test implements Runnable {
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println(Thread.currentThread().getName() + "---" + i);
        }
    }
}

public class Deno1 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Test t = new Test();
        Thread t1 = new Thread(t);
        t1.start();
    }

}