JAVA多线程,怎么总是输出两个同样的

JAVA多线程,怎么总是输出两个同样的,第1张

这应该是java中多线程的安全问题吧,CPU处理切换时间片的速率是非常快的,

当线程1判断完之后还没来得及输出,时间片就切换到线程2上了,

然后又进行了一次判断结果还是大于0,但是还没等到线程2输出就又回到了线程1,接着执行

输出语句,比如输出10,输出完之后又一次回到线程2上进行第二次输出,输出的结果和线程1

一样(10)。我觉得应该是临时阻塞问题。 希望能够采纳

class MyThread implements Runnable {

private String name;

private int sum=100;

public MyThread(String name) {

thisname = name;

}

public void run() {

for (int i = 0; i < 100; i++) {

if(sum>0){

Systemoutprintln("线程开始:" + thisname + ",sum=" + sum--);

}}

}

};

public class ThreadDemo01 {

public static void main(String[] args) {

MyThread mt1 = new MyThread("线程a");

new Thread(mt1)start();

new Thread(mt1)start();

}

}

你的答案有两个问题:

1,obj不是static,就是说每个线程都有自己的obj,synchronize锁的是自己线程的obj,不能起到阻塞其它线程的作用。运行的话会看到有的票被出售多次。

2,while (num > 0)在syncronize之外,因为没被同步,其它线程可能在对比num > 0之后修改num的值,可能导致计数为负数的票被卖出,或者其它奇怪的结果。

所以最后的答案才能得到可靠的结果。

public class SaleTicket extends Thread{

static int mark=0;

static int ticket[]=new int [100];

int SaleTicketNo;

SaleTicket(int num){

SaleTicketNo=num;

}

public void run() {

// compute primes larger than minPrime

for(int i=0;i<100;i++)

{

if(ticket[i]==0){

ticket[i]=1;

mark=mark+1;

Systemoutprintln("售票机编号:"+SaleTicketNo+" 票号:"+i+" 张次:"+mark);

}

}

}

}

public class Test {

/

@param args

/

public static void main(String[] args) {

SaleTicket sale1=new SaleTicket(101);

SaleTicket sale2=new SaleTicket(102);

SaleTicket sale3=new SaleTicket(103);

SaleTicket sale4=new SaleTicket(104);

SaleTicket sale5=new SaleTicket(105);

sale1start();

sale2start();

sale3start();

sale4start();

sale5start();

}

}

不考虑死锁问题

原因是解析长度过大。

user ticket解析失败原因是解析不支持过大的长度。更新补丁就好啦。更新目录为1Java\jre180_181\lib\security\policy2\Java\jdk180_151\jre\lib\security\policy。

司机ticket验证失败解决方法如下:

1重启手机尝试一下,不要一天多次获取验证码。2卸载,重新下载安装一次。司机,也就是掌握“机”的人。机器出现在人类社会上,是瓦特发明蒸汽机之后。从那时候开始,就出现了司机一词。从这个意义引申开来,所有掌管机器的人,都可称呼为司机。亦可称“驾驶员”,是指驾驶和控制 车辆的人,包括路面车辆和铁路车辆在内。日本称“运转手”或“运转士”,英文叫“Driver”。司机可以分为职业司机、车主或其亲友借车暂用,还有是出租车司机、代客泊车多种。

class out implements Runnable

{

private int ticket = 100;

public synchronized void run()

{

while (true)

{

if (ticket>o)

{

Systemoutprintln(ThreadcurrentThread()getName()+"="+"sale"+ticket--);//若改成thisgetName();不行因为接口里没有getName();

}

}

}

}

class RunnableDemo

{

public static void main(String[] args)

{

Ticket P = new Ticket();//先创造接口对象

Thread P1 = new Thread(P);//再把接口对象给Thread

Thread P2 = new Thread(P);

P1start();

P2start();

}

这是最基本的。。多线程里面玩的就是同步代码块。。都是手打的。。分给我吧,运行的时候运行RunnableDemo;

public class Ticket{

private float price = 5000;

public float getPrice(int month, int cabin){

float discount = 0;

if (month >= 4 && month <= 10) {

if (cabin==1) {

discount = 09f;

}else{

discount = 05f;

}

}else{

if (cabin==1) {

discount = 08f;

}else{

discount = 04f;

}

}

return price  discount;

}

public static void main(String[] args) {

Ticket test = new Ticket();

Systemoutprintln("4月旺季要去海南旅游:头等仓标价:" + testgetPrice(4, 1));

Systemoutprintln("10月旺季要去海南旅游:经济仓标价:" + testgetPrice(10, 2));

Systemoutprintln("3月淡季要去海南旅游:头等仓标价:" + testgetPrice(3, 1));

Systemoutprintln("11月淡季要去海南旅游:经济仓标价:" + testgetPrice(11, 2));

}

}

以上就是关于JAVA多线程,怎么总是输出两个同样的全部的内容,包括:JAVA多线程,怎么总是输出两个同样的、java怎么用两个线程共同完成1到100的输出啊 求代码 谢谢、java 中多线程中的四个窗口卖100张票问题 我的答案是等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/9266638.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存