多线程基础例题1
创建三个窗口卖票,总票数100张
先用Thread方法写一遍代码
package new1;
public class demo3 {
public static void main(String[] args) {
window t1 = new window();
window t2 = new window();
window t3 = new window();
t1.setName("窗口1");
t2.setName("窗口2");
t3.setName("窗口3");
t1.start();
t2.start();
t3.start();
}
}
class window extends Thread{
private int ticket = 50;
public void run(){
while(true){
if(ticket>0){
System.out.println(getName()+"卖票,票号为:"+ticket);
ticket--;
}else{
break;
}
}
}
}
结果
窗口1卖票,票号为:50
窗口1卖票,票号为:49
窗口1卖票,票号为:48
窗口1卖票,票号为:47
窗口1卖票,票号为:46
窗口1卖票,票号为:45
窗口1卖票,票号为:44
窗口1卖票,票号为:43
窗口3卖票,票号为:50
窗口3卖票,票号为:49
窗口3卖票,票号为:48
窗口3卖票,票号为:47
窗口3卖票,票号为:46
窗口2卖票,票号为:50
窗口2卖票,票号为:49
窗口2卖票,票号为:48
窗口3卖票,票号为:45
窗口3卖票,票号为:44
窗口3卖票,票号为:43
窗口3卖票,票号为:42
窗口3卖票,票号为:41
窗口3卖票,票号为:40
窗口1卖票,票号为:42
窗口3卖票,票号为:39
窗口3卖票,票号为:38
窗口3卖票,票号为:37
窗口2卖票,票号为:47
窗口3卖票,票号为:36
窗口1卖票,票号为:41
窗口1卖票,票号为:40
窗口1卖票,票号为:39
窗口1卖票,票号为:38
窗口1卖票,票号为:37
窗口1卖票,票号为:36
窗口1卖票,票号为:35
窗口1卖票,票号为:34
窗口1卖票,票号为:33
窗口1卖票,票号为:32
窗口1卖票,票号为:31
窗口1卖票,票号为:30
窗口1卖票,票号为:29
窗口1卖票,票号为:28
窗口1卖票,票号为:27
窗口1卖票,票号为:26
窗口1卖票,票号为:25
窗口3卖票,票号为:35
窗口3卖票,票号为:34
窗口3卖票,票号为:33
窗口3卖票,票号为:32
窗口3卖票,票号为:31
窗口3卖票,票号为:30
窗口3卖票,票号为:29
窗口3卖票,票号为:28
窗口3卖票,票号为:27
窗口3卖票,票号为:26
窗口3卖票,票号为:25
窗口3卖票,票号为:24
窗口3卖票,票号为:23
窗口2卖票,票号为:46
窗口2卖票,票号为:45
窗口2卖票,票号为:44
窗口2卖票,票号为:43
窗口3卖票,票号为:22
窗口3卖票,票号为:21
窗口1卖票,票号为:24
窗口1卖票,票号为:23
窗口1卖票,票号为:22
窗口1卖票,票号为:21
窗口1卖票,票号为:20
窗口1卖票,票号为:19
窗口3卖票,票号为:20
窗口3卖票,票号为:19
窗口3卖票,票号为:18
窗口3卖票,票号为:17
窗口3卖票,票号为:16
窗口3卖票,票号为:15
窗口3卖票,票号为:14
窗口3卖票,票号为:13
窗口3卖票,票号为:12
窗口3卖票,票号为:11
窗口3卖票,票号为:10
窗口3卖票,票号为:9
窗口3卖票,票号为:8
窗口3卖票,票号为:7
窗口3卖票,票号为:6
窗口3卖票,票号为:5
窗口2卖票,票号为:42
窗口2卖票,票号为:41
窗口2卖票,票号为:40
窗口2卖票,票号为:39
窗口2卖票,票号为:38
窗口2卖票,票号为:37
窗口2卖票,票号为:36
窗口2卖票,票号为:35
窗口2卖票,票号为:34
窗口2卖票,票号为:33
窗口2卖票,票号为:32
窗口2卖票,票号为:31
窗口3卖票,票号为:4
窗口3卖票,票号为:3
窗口3卖票,票号为:2
窗口3卖票,票号为:1
窗口1卖票,票号为:18
窗口2卖票,票号为:30
窗口1卖票,票号为:17
窗口1卖票,票号为:16
窗口1卖票,票号为:15
窗口1卖票,票号为:14
窗口2卖票,票号为:29
窗口2卖票,票号为:28
窗口2卖票,票号为:27
窗口2卖票,票号为:26
窗口2卖票,票号为:25
窗口1卖票,票号为:13
窗口1卖票,票号为:12
窗口1卖票,票号为:11
窗口1卖票,票号为:10
窗口2卖票,票号为:24
窗口1卖票,票号为:9
窗口1卖票,票号为:8
窗口1卖票,票号为:7
窗口1卖票,票号为:6
窗口1卖票,票号为:5
窗口1卖票,票号为:4
窗口1卖票,票号为:3
窗口1卖票,票号为:2
窗口2卖票,票号为:23
窗口2卖票,票号为:22
窗口2卖票,票号为:21
窗口2卖票,票号为:20
窗口2卖票,票号为:19
窗口2卖票,票号为:18
窗口2卖票,票号为:17
窗口2卖票,票号为:16
窗口2卖票,票号为:15
窗口2卖票,票号为:14
窗口2卖票,票号为:13
窗口2卖票,票号为:12
窗口2卖票,票号为:11
窗口2卖票,票号为:10
窗口2卖票,票号为:9
窗口2卖票,票号为:8
窗口2卖票,票号为:7
窗口2卖票,票号为:6
窗口2卖票,票号为:5
窗口2卖票,票号为:4
窗口2卖票,票号为:3
窗口2卖票,票号为:2
窗口2卖票,票号为:1
窗口1卖票,票号为:1
此时不是50张而是150张,应该修改private为static,实现数据共享
package new1;
public class demo3 {
public static void main(String[] args) {
window t1 = new window();
window t2 = new window();
window t3 = new window();
t1.setName("窗口1");
t2.setName("窗口2");
t3.setName("窗口3");
t1.start();
t2.start();
t3.start();
}
}
class window extends Thread{
private static int ticket = 5;
public void run(){
while(true){
if(ticket>0){
System.out.println(getName()+"卖票,票号为:"+ticket);
ticket--;
}else{
break;
}
}
}
}
窗口2卖票,票号为:5
窗口2卖票,票号为:4
窗口2卖票,票号为:3
窗口2卖票,票号为:2
窗口2卖票,票号为:1
窗口1卖票,票号为:5
窗口3卖票,票号为:5
很明显有重复的票号,所以应该解决多线程的安全问题,这点放在下一节锁的学习再来解决
使用runnable接口的方式
package new1;
public class demo4 {
public static void main(String[] args) {
Window1 w = new Window1(); //此时只造了一个对象
Thread t1 = new Thread(w); //一个对象放到三个构造器中,相当于三个线程用的同一个对象,所以ticket不用担心是总数是300
Thread t2 = new Thread(w);
Thread t3 = new Thread(w);
t1.setName("窗口一");
t2.setName("窗口二");
t3.setName("窗口三");
t1.start();
t2.start();
t3.start();
}
}
//创建一个实现了Runnable接口的类
class Window1 implements Runnable{
private int ticket = 100;
public void run(){
while(true){
if(ticket > 0){
System.out.println(Thread.currentThread().getName()+"卖票,票号为:"+ticket);
ticket--;
}else{
break;
}
}
}
}
结果
窗口一卖票,票号为:100
窗口一卖票,票号为:99
窗口一卖票,票号为:98
窗口一卖票,票号为:97
窗口一卖票,票号为:96
窗口一卖票,票号为:95
窗口一卖票,票号为:94
窗口一卖票,票号为:93
窗口一卖票,票号为:92
窗口二卖票,票号为:100
窗口二卖票,票号为:90
窗口二卖票,票号为:89
窗口二卖票,票号为:88
窗口二卖票,票号为:87
窗口三卖票,票号为:100
窗口三卖票,票号为:85
窗口三卖票,票号为:84
窗口三卖票,票号为:83
窗口三卖票,票号为:82
窗口三卖票,票号为:81
窗口三卖票,票号为:80
窗口三卖票,票号为:79
窗口三卖票,票号为:78
窗口三卖票,票号为:77
窗口三卖票,票号为:76
窗口三卖票,票号为:75
窗口三卖票,票号为:74
窗口三卖票,票号为:73
窗口三卖票,票号为:72
窗口三卖票,票号为:71
窗口三卖票,票号为:70
窗口三卖票,票号为:69
窗口三卖票,票号为:68
窗口三卖票,票号为:67
窗口三卖票,票号为:66
窗口三卖票,票号为:65
窗口三卖票,票号为:64
窗口三卖票,票号为:63
窗口三卖票,票号为:62
窗口三卖票,票号为:61
窗口三卖票,票号为:60
窗口三卖票,票号为:59
窗口三卖票,票号为:58
窗口三卖票,票号为:57
窗口三卖票,票号为:56
窗口三卖票,票号为:55
窗口三卖票,票号为:54
窗口三卖票,票号为:53
窗口三卖票,票号为:52
窗口二卖票,票号为:86
窗口二卖票,票号为:50
窗口二卖票,票号为:49
窗口二卖票,票号为:48
窗口二卖票,票号为:47
窗口二卖票,票号为:46
窗口二卖票,票号为:45
窗口二卖票,票号为:44
窗口二卖票,票号为:43
窗口二卖票,票号为:42
窗口二卖票,票号为:41
窗口二卖票,票号为:40
窗口二卖票,票号为:39
窗口一卖票,票号为:91
窗口二卖票,票号为:38
窗口二卖票,票号为:36
窗口二卖票,票号为:35
窗口二卖票,票号为:34
窗口二卖票,票号为:33
窗口二卖票,票号为:32
窗口二卖票,票号为:31
窗口二卖票,票号为:30
窗口二卖票,票号为:29
窗口三卖票,票号为:51
窗口三卖票,票号为:27
窗口三卖票,票号为:26
窗口三卖票,票号为:25
窗口二卖票,票号为:28
窗口二卖票,票号为:23
窗口二卖票,票号为:22
窗口二卖票,票号为:21
窗口二卖票,票号为:20
窗口二卖票,票号为:19
窗口二卖票,票号为:18
窗口二卖票,票号为:17
窗口二卖票,票号为:16
窗口二卖票,票号为:15
窗口二卖票,票号为:14
窗口二卖票,票号为:13
窗口二卖票,票号为:12
窗口二卖票,票号为:11
窗口二卖票,票号为:10
窗口二卖票,票号为:9
窗口二卖票,票号为:8
窗口二卖票,票号为:7
窗口二卖票,票号为:6
窗口二卖票,票号为:5
窗口二卖票,票号为:4
窗口二卖票,票号为:3
窗口二卖票,票号为:2
窗口二卖票,票号为:1
窗口一卖票,票号为:37
窗口三卖票,票号为:24
很明显也存在安全问题,所以需要学习锁来尝试解决问题