N个线程循环打印

方法一:同步锁

public class printNum {
	private static int count = 0;
	
    public static void main(String[] args) {
    	Scanner scanner = new Scanner(System.in);
    	int threadCount = scanner.nextInt();
    	scanner.close();
    	for(int i = 0 ; i < threadCount ; i++){
    		Thread thread = new PrintNumThread(i,threadCount);
    		thread.start();
    	}
    }
    
    public synchronized static int getCount(){
		 return count;
	 }
	 
	 public synchronized static void addCount(){
		 count++;
	 }
    
    static class PrintNumThread extends Thread{
    	 
    	 private int currentNo;
    	 private int threadCount;
    	 
    	 public PrintNumThread(int currentNo,int threadCount){
    		 this.currentNo = currentNo;
    		 this.threadCount = threadCount;
    	 }
    	 
    	
    	
    	public void run()
		{
    			try {
    				while (true) {
    					int count = getCount();
    					if(count < 120 && count%threadCount == currentNo){
    						System.out.println(Thread.currentThread().getName()+":"+count);
    						addCount();
    					}else if(count >= 120){
    						System.exit(0);
    					}
    				}
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		}
    }
}

运行结果:

11
Thread-0:0
Thread-1:1
Thread-2:2
Thread-3:3
Thread-4:4
Thread-5:5
Thread-6:6
Thread-7:7
Thread-8:8
Thread-9:9
Thread-10:10
Thread-0:11
Thread-1:12
Thread-2:13
Thread-3:14
Thread-4:15
Thread-5:16
Thread-6:17
Thread-7:18
Thread-8:19
Thread-9:20
Thread-10:21
Thread-0:22
Thread-1:23
Thread-2:24
Thread-3:25
Thread-4:26
Thread-5:27
Thread-6:28
Thread-7:29
Thread-8:30
Thread-9:31
Thread-10:32
Thread-0:33
Thread-1:34
Thread-2:35
Thread-3:36
Thread-4:37
Thread-5:38
Thread-6:39
Thread-7:40
Thread-8:41
Thread-9:42
Thread-10:43
Thread-0:44
Thread-1:45
Thread-2:46
Thread-3:47
Thread-4:48
Thread-5:49
Thread-6:50
Thread-7:51
Thread-8:52
Thread-9:53
Thread-10:54
Thread-0:55
Thread-1:56
Thread-2:57
Thread-3:58
Thread-4:59
Thread-5:60
Thread-6:61
Thread-7:62
Thread-8:63
Thread-9:64
Thread-10:65
Thread-0:66
Thread-1:67
Thread-2:68
Thread-3:69
Thread-4:70
Thread-5:71
Thread-6:72
Thread-7:73
Thread-8:74
Thread-9:75
Thread-10:76
Thread-0:77
Thread-1:78
Thread-2:79
Thread-3:80
Thread-4:81
Thread-5:82
Thread-6:83
Thread-7:84
Thread-8:85
Thread-9:86
Thread-10:87
Thread-0:88
Thread-1:89
Thread-2:90
Thread-3:91
Thread-4:92
Thread-5:93
Thread-6:94
Thread-7:95
Thread-8:96
Thread-9:97
Thread-10:98
Thread-0:99
Thread-1:100
Thread-2:101
Thread-3:102
Thread-4:103
Thread-5:104
Thread-6:105
Thread-7:106
Thread-8:107
Thread-9:108
Thread-10:109
Thread-0:110
Thread-1:111
Thread-2:112
Thread-3:113
Thread-4:114
Thread-5:115
Thread-6:116
Thread-7:117
Thread-8:118
Thread-9:119

方法二:使用信号量进行相互间的逻辑处理

public class printNum {
	private static int count = 0;
	static Semaphore[] semaphores = null;
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int threadCount = scanner.nextInt();
		scanner.close();
		semaphores = new Semaphore[threadCount];
		try {
			for (int i = 0; i < threadCount; i++) {
				semaphores[i] = new Semaphore(1);
				if (i > 0) {
					semaphores[i].acquire();
				}
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		for (int i = 0; i < threadCount; i++) {
			Thread thread = new InformationThread(i);
			thread.start();
		}
	}
    
    static class InformationThread extends Thread{
    	 
    	 private int currentNo;
    	 
    	 public InformationThread(int currentNo){
    		 this.currentNo = currentNo;
    	 }
    	 
    	
    	
    	public void run()
		{
    			try {
    				while (true) {
    					if(semaphores[currentNo].availablePermits() == 1){
    						if(count < 120 ){
    							semaphores[currentNo].acquire();
    							System.out.println(Thread.currentThread().getName()+":"+count);
    							count++;
    							if((currentNo+1) >= semaphores.length){
    								semaphores[0].release();
    							}else{
    								semaphores[currentNo+1].release();
    							}
    						}else if(count >= 120){
    							System.exit(0);
    						}
    					}
    				}
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		}
    }
}

运行结果:

 

Thread-0:0
Thread-1:1
Thread-2:2
Thread-3:3
Thread-4:4
Thread-5:5
Thread-6:6
Thread-7:7
Thread-8:8
Thread-9:9
Thread-10:10
Thread-11:11
Thread-0:12
Thread-1:13
Thread-2:14
Thread-3:15
Thread-4:16
Thread-5:17
Thread-6:18
Thread-7:19
Thread-8:20
Thread-9:21
Thread-10:22
Thread-11:23
Thread-0:24
Thread-1:25
Thread-2:26
Thread-3:27
Thread-4:28
Thread-5:29
Thread-6:30
Thread-7:31
Thread-8:32
Thread-9:33
Thread-10:34
Thread-11:35
Thread-0:36
Thread-1:37
Thread-2:38
Thread-3:39
Thread-4:40
Thread-5:41
Thread-6:42
Thread-7:43
Thread-8:44
Thread-9:45
Thread-10:46
Thread-11:47
Thread-0:48
Thread-1:49
Thread-2:50
Thread-3:51
Thread-4:52
Thread-5:53
Thread-6:54
Thread-7:55
Thread-8:56
Thread-9:57
Thread-10:58
Thread-11:59
Thread-0:60
Thread-1:61
Thread-2:62
Thread-3:63
Thread-4:64
Thread-5:65
Thread-6:66
Thread-7:67
Thread-8:68
Thread-9:69
Thread-10:70
Thread-11:71
Thread-0:72
Thread-1:73
Thread-2:74
Thread-3:75
Thread-4:76
Thread-5:77
Thread-6:78
Thread-7:79
Thread-8:80
Thread-9:81
Thread-10:82
Thread-11:83
Thread-0:84
Thread-1:85
Thread-2:86
Thread-3:87
Thread-4:88
Thread-5:89
Thread-6:90
Thread-7:91
Thread-8:92
Thread-9:93
Thread-10:94
Thread-11:95
Thread-0:96
Thread-1:97
Thread-2:98
Thread-3:99
Thread-4:100
Thread-5:101
Thread-6:102
Thread-7:103
Thread-8:104
Thread-9:105
Thread-10:106
Thread-11:107
Thread-0:108
Thread-1:109
Thread-2:110
Thread-3:111
Thread-4:112
Thread-5:113
Thread-6:114
Thread-7:115
Thread-8:116
Thread-9:117
Thread-10:118
Thread-11:119

 

错误写法:

public class printNum {
	private static int count = 0;
	static Semaphore[] semaphores = null;
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int threadCount = scanner.nextInt();
		scanner.close();
		semaphores = new Semaphore[threadCount];
		try {
			for (int i = 0; i < threadCount; i++) {
				semaphores[i] = new Semaphore(1);
				if (i > 0) {
					semaphores[i].acquire();
				}
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		for (int i = 0; i < threadCount; i++) {
			Thread thread = new InformationThread(i);
			thread.start();
		}
	}
    
    static class InformationThread extends Thread{
    	 
    	 private int currentNo;
    	 
    	 public InformationThread(int currentNo){
    		 this.currentNo = currentNo;
    	 }
    	 
    	
    	
    	public void run()
		{
    			try {
    				while (true) {
    						if(count < 120 ){
    							semaphores[currentNo].acquire();
    							System.out.println(Thread.currentThread().getName()+":"+count);
    							count++;
    							if((currentNo+1) >= semaphores.length){
    								semaphores[0].release();
    							}else{
    								semaphores[currentNo+1].release();
    							}
    						}else if(count >= 120){
    							System.exit(0);
    						}
    				}
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		}
    }
}

运行结果:

Thread-0:0
Thread-1:1
Thread-2:2
Thread-3:3
Thread-4:4
Thread-5:5
Thread-6:6
Thread-7:7
Thread-8:8
Thread-9:9
Thread-10:10
Thread-11:11
Thread-0:12
Thread-1:13
Thread-2:14
Thread-3:15
Thread-4:16
Thread-5:17
Thread-6:18
Thread-7:19
Thread-8:20
Thread-9:21
Thread-10:22
Thread-11:23
Thread-0:24
Thread-1:25
Thread-2:26
Thread-3:27
Thread-4:28
Thread-5:29
Thread-6:30
Thread-7:31
Thread-8:32
Thread-9:33
Thread-10:34
Thread-11:35
Thread-0:36
Thread-1:37
Thread-2:38
Thread-3:39
Thread-4:40
Thread-5:41
Thread-6:42
Thread-7:43
Thread-8:44
Thread-9:45
Thread-10:46
Thread-11:47
Thread-0:48
Thread-1:49
Thread-2:50
Thread-3:51
Thread-4:52
Thread-5:53
Thread-6:54
Thread-7:55
Thread-8:56
Thread-9:57
Thread-10:58
Thread-11:59
Thread-0:60
Thread-1:61
Thread-2:62
Thread-3:63
Thread-4:64
Thread-5:65
Thread-6:66
Thread-7:67
Thread-8:68
Thread-9:69
Thread-10:70
Thread-11:71
Thread-0:72
Thread-1:73
Thread-2:74
Thread-3:75
Thread-4:76
Thread-5:77
Thread-6:78
Thread-7:79
Thread-8:80
Thread-9:81
Thread-10:82
Thread-11:83
Thread-0:84
Thread-1:85
Thread-2:86
Thread-3:87
Thread-4:88
Thread-5:89
Thread-6:90
Thread-7:91
Thread-8:92
Thread-9:93
Thread-10:94
Thread-11:95
Thread-0:96
Thread-1:97
Thread-2:98
Thread-3:99
Thread-4:100
Thread-5:101
Thread-6:102
Thread-7:103
Thread-8:104
Thread-9:105
Thread-10:106
Thread-11:107
Thread-0:108
Thread-1:109
Thread-2:110
Thread-3:111
Thread-4:112
Thread-5:113
Thread-6:114
Thread-7:115
Thread-8:116
Thread-9:117
Thread-10:118
Thread-11:119
Thread-0:120
Thread-1:121
Thread-2:122
Thread-3:123
Thread-4:124
Thread-5:125

 

转载于:https://my.oschina.net/u/3680947/blog/3024287

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值