通过线程解决实际问题
程序员文章站
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();
}
}
推荐阅读
-
解决PySide+Python子线程更新UI线程的问题
-
通过修复注册表解决语言栏消失即右键没有语言栏这个选项
-
Surface Pro 3电池续航异常或可通过软件升级解决
-
醒酒方法有哪些呢?让你通过饮食就可以解决
-
摄像头黑屏不能用通过更新摄像头驱动进行解决
-
守护线程,需要通过调用线程方法:setDaemon(boolean on)来进行设置
-
vegas怎么裁剪黑边? vegas通过裁剪去黑边时画面比例变化的解决办法
-
Python中用Ctrl+C终止多线程程序的问题解决
-
通过过滤器(Filter)解决JSP的Post和Request中文乱码问题
-
微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)