
这应该是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张票问题 我的答案是等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)