虽然问题根本不清楚,但我想您可能希望以正确的顺序打印每个子数组。
这意味着像这样的输出:
Thread 1:0
Thread 1:1
Thread 1:2
Thread 1:3
Thread 1:4
Thread 1:5
Thread 1:6
Thread 1:7
Thread 1:8
Thread 1:9
Thread 1:10
Thread 1:11
Thread 1:12
Thread 1:13
Thread 1:14
Thread 1:15
Thread 1:16
Thread 1:17
Thread 1:18
Thread 1:19
Thread 1:20
Thread 1:21
Thread 1:22
Thread 1:23
Thread 1:24
Thread 4:75
Thread 4:76
Thread 4:77
Thread 4:78
Thread 4:79
Thread 4:80
Thread 4:81
Thread 4:82
Thread 4:83
Thread 4:84
Thread 4:85
Thread 4:86
Thread 4:87
Thread 4:88
Thread 4:89
Thread 4:90
Thread 4:91
Thread 4:92
Thread 4:93
Thread 4:94
Thread 4:95
Thread 4:96
Thread 4:97
Thread 4:98
Thread 4:99
Thread 3:50
Thread 3:51
Thread 3:52
Thread 3:53
Thread 3:54
Thread 3:55
Thread 3:56
Thread 3:57
Thread 3:58
Thread 3:59
Thread 3:60
Thread 3:61
Thread 3:62
Thread 3:63
Thread 3:64
Thread 3:65
Thread 3:66
Thread 3:67
Thread 3:68
Thread 3:69
Thread 3:70
Thread 3:71
Thread 3:72
Thread 3:73
Thread 3:74
Thread 2:25
Thread 2:26
Thread 2:27
Thread 2:28
Thread 2:29
Thread 2:30
Thread 2:31
Thread 2:32
Thread 2:33
Thread 2:34
Thread 2:35
Thread 2:36
Thread 2:37
Thread 2:38
Thread 2:39
Thread 2:40
Thread 2:41
Thread 2:42
Thread 2:43
Thread 2:44
Thread 2:45
Thread 2:46
Thread 2:47
Thread 2:48
Thread 2:49
为此,您只需添加一个Object
要同步的对象,您可以使用以下内容:
final Object lock = new Object();
然后你需要改变你run
的方法来同步lock
public void run() {
synchronized (lock) {
for (int a = i * (M / N); a < (i + 1) * (M / N); a++) {
System.out.println("Thread " + (i + 1) + ":" + array[a]);
}
}
}
这是完整编辑的主要内容:
public static void main(String[] args) {
final int M = 100;
final int N = 4;
final int[] array = new int[M];
final Object lock = new Object(); // LOCK!!
for (int b = 0; b < M; b++) {
array[b] = b;
}
for (int p = 0; p < N; p++) {
final int i = p;
new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) { // SYNCHRONIZED BLOCK INSTEAD OF SYNCHRONIZED METHOD
for (int a = i * (M / N); a < (i + 1) * (M / N); a++) {
System.out.println("Thread " + (i + 1) + ":" + array[a]);
}
}
}
}).start();
}
}
当然,如果您只想按照内部元素的相同顺序打印数组,则不必处理线程。
编辑:
关于为什么您的代码无法按预期工作的一点解释:
可以将同步方法视为自身同步的方法。
这意味着
synchronized void method(){
doSomething();
}
可以看作
void method(){
synchronized(this){
doSomething();
}
}
获取您的代码,您有 4 个不同Runnable
的synchronized void run()
方法实例。
这意味着每个run
都将在不同的对象(Runnable
实例)上同步,这就是根本没有同步的原因。
为了“一起工作”,线程必须在同一个对象上同步!