方法一:同步锁
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