场景一,多个线程要求按照指定的顺序执行, 如现在有A、B、C 3个线程,要求按照A->B->C的顺序来依次执行。
解决思路: A B C 线程需要共享一个标志位,依据标志位来决定A B C是该立即执行还是该阻塞或者是等待或者是让出时间片。
方案1, 用AtomicInteger作为标识位, 用该变量对线程数(3)取模,如果非特定值,则让当前线程让出CPU时间片。否则执行业务逻辑并对标识位进行更新。
public class SeqPrint {
private int n;
public SeqPrint(int n) {
this.n = n;
}
AtomicLong idx = new AtomicLong(0L);
public void foo() throws InterruptedException {
for (int i = 0; i < n; i++) {
while (idx.get() % 2 != 0) {
Thread.yield();
}
System.out.print("foo");
idx.getAndIncrement();
}
}
public void bar() throws InterruptedException {
for (int i = 0; i < n; i++) {
while (idx.get() % 2 == 0) {
Thread.yield();
}
System.out.print("bar");
idx.getAndIncrement();
}
}
public static void main(String[] args) throws InterruptedException {
final SeqPrint seqPrint = new SeqPrint(10);
Thread t1 = new Thread(new Runnable() {
public void run() {
try {
seqPrint.foo();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
try {
seqPrint.bar();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t2.start();
t1.start();
}
}
VGhpcyBpcyBhIHByb2dyYW1taW5nIHRlc3QgYXNzaWdubWVudCBmb3IgY2FuZGlkYXRlcy4NCllvdSBtdXN0IHdvcmsgb24geW91ciBvd24sIGFuZCBzdWJtaXQgeW91ciB3b3JrIHdpdGhpbiAzIGRheXMuIFRoZSB3aG9sZSBzb2x1dGlvbiBtdXN0IGJlIHlvdXIgb3JpZ2luYWwgd29yay4NCklmIHRoZXJlIGlzIGFueXRoaW5nIHVuY2xlYXIgdG8geW91IGFuZCBpcyBub3QgbWVudGlvbmVkIGluIHRoZSBhc3NpZ25tZW50LCB5b3UgY2FuIG1ha2UgeW91ciBvd24gcmVhc29uYWJsZQ0KYXNzdW1wdGlvbiBhbmQgY29tcGxldGUgeW91ciB3b3JrLg0KWW91IGNhbiBtZW50aW9uIHlvdXIgYXNzdW1wdGlvbiBpbiB0aGUgUkVBRE1FLm1kIGZpbGUuDQpZb3Ugc2hvdWxkIHByb3ZpZGUgYSBSRUFETUUubWQgd2l0aCBpbnN0cnVjdGlvbnMgdG8gZXhlY3V0ZSB0aGUgc29sdXRpb24gYW5kIGEgYnJpZWYgZGVzY3JpcHRpb24gb24gdGhlDQpkZWNpc2lvbnMgbWFkZSBmb3IgdGhlIHNvbHV0aW9uLg0KV2hhdCB3ZSBhcmUgbG9va2luZyBmb3I6DQoqIEZ1bmN0aW9uYWwgY29ycmVjdG5lc3MgKFRoZSBzb2x1dGlvbiB3b3JrcykNCiogVXNhZ2Ugb2YgSmF2YSBTdHJlYW0gQVBJIChqYXZhLnV0aWwuc3RyZWFtKSAoanVzdCB0byBjbGVhciBhbnkgZG91YnQgdGhhdCB3ZSBkb24ndCB3YW50IEthZmthIFN0cmVhbSkNCiogRXhwYW5kYWJpbGl0eSBvZiB0aGUgZGVzaWduDQoqIFRoZSBzdWJtaXR0ZWQgY29kZSBpcyB0ZXN0ZWQsIHdpdGggdGVzdCBzdGVwcyBhbmQgdGVzdCByZXN1bHQgaW5jbHVkZWQgaW4gdGhlIFJFQURNRS5tZCBmaWxlDQpTdG9yeQ0KQXMgYSBzZWN1cml0aWVzIHNldHRsZW1lbnQgY29tcGFueSBpbiBhIHNpbXBsZSBtYXJrZXQsDQpJIHdhbnQgdG8gcmVhZCB0aGUgdHJhZGUgcmVjb3JkcyBmcm9tIGN1c3RvbWVyIGFuZCBjYXB0dXJlIGFuZCBlbnJpY2ggdGhlIHRyYWRlIGRldGFpbHMsDQpzbyB0aGF0IHRoZSB0cmFkZXMgY2FuIGJlIHNlbnQgdG8gb3RoZXIgZG93bnN0cmVhbSBzZXJ2aWNlcyBmb3IgZnVydGhlciBwcm9jZXNzaW5nLg0KQWNjZXB0YW5jZSBDcml0ZXJpYQ0KKiBUcmFkZSBDYXB0dXJlIFNlcnZpY2U6DQoqIE1vbml0b3IgYW5kIHJlYWQgdGV4dCBmaWxlcyBjb250YWluaW5nIGFuIGFycmF5IG9mIEpTT04gb2JqZWN0cyAoZS5nLiB0cmFkZSByZWNvcmRzKSBpbiBhIHNwZWNpZmljDQpsb2NhdGlvbg0KKiBSZWFkIHRoZSBKU09OIG9iamVjdHMgaW5zaWRlIHRoZSBmaWxlIGFuZCB0cmFuc2Zvcm0gdGhlbSBpbnRvIGFub3RoZXIgSlNPTiBkYXRhIGZvcm1hdCAoc2VlIGV4YW1wbGUNCmJlbG93KQ0KKiBQdWJsaXNoIHRoZSBKU09OIG9iamVjdHMgdG8gYSBLYWZrYSB0b3BpYyBmb3IgZG93bnN0cmVhbSBzZXJ2aWNlcw0KKiBEb3duc3RyZWFtIEZlZWQgU2VydmljZSAxOg0KKiBFdmVyeSA1IG1pbnV0ZSwgcmVhZCB0aGUgZGF0YSBmcm9tIHRoZSBLYWZrYSB0b3BpYywgb3V0cHV0IHRoZSBkYXRhIGludG8gYSBuZXcgdGV4dCBmaWxlIGluIGEgc3BlY2lmaWMNCmxvY2F0aW9uIGZvciBzZXJ2aWNlIEENCiogRG93bnN0cmVhbSBGZWVkIFNlcnZpY2UgMjoNCiogRXZlcnkgMSBtaW51dGUsIHJlYWQgdGhlIGRhdGEgZnJvbSB0aGUgS2Fma2EgdG9waWMsIG91dHB1dCB0aGUgZGF0YSBpbnRvIEFOT1RIRVIgbmV3IHRleHQgZmlsZSBpbg0KQU5PVEhFUiBzcGVjaWZpYyBsb2NhdGlvbiBmb3Igc2VydmljZSBCDQpFeGFtcGxlIG9mIGlucHV0IGZpbGU6DQpbDQp7DQoidHJhZGVSZWZlcmVuY2UiIDogIlQwMDAwMSIgLA0KImFjY291bnROdW1iZXIiIDogIjEzMDAyMTgyNzciICwNCiJzdG9ja0NvZGUiIDogIktPIiAsDQoicXVhbnRpdHkiIDogIjI4OC4xMjAwMDAiICwNCiJjdXJyZW5jeSIgOiAiVVNEIiAsDQoicHJpY2UiIDogIjEyMzQuNTYiICwNCiJicm9rZXIiIDogIkIwMDEyMyINCn0gLA0Kew0KLi4uIChhbm90aGVyIEpTT04gcmVjb3JkKQ0KfSAsDQouLi4gKG1vcmUgSlNPTiByZWNvcmRzKQ0KXQ0KRXhhbXBsZSBvZiBvdXRwdXQgZmlsZToNCk5vdGU6IEFtb3VudCA9IFByaWNlICogUXVhbnRpdHkgKHJvdW5kIHVwKS4gUmVjZWl2ZWQgdGltZXN0YW1wIGlzIHNlcnZlciB0aW1lIGluIFVUQyBvZmZzZXQuDQpbDQp7DQoidHJhZGVSZWZlcmVuY2UiIDogIlQwMDAwMSIgLA0KImFjY291bnROdW1iZXIiIDogIjEzMDAyMTgyNzciICwNCiJzdG9ja0NvZGUiIDogIktPIiAsDQoicXVhbnRpdHkiIDogIjI4OC4xMjAwMDAiICwNCiJjdXJyZW5jeSIgOiAiVVNEIiAsDQoicHJpY2UiIDogIjEyMzQuNTYiICwNCiJicm9rZXIiIDogIkIwMDEyMyIgLA0KImFtb3VudCIgOiAiMzU1NzAxLjQzIiAsDQoicmVjZWl2ZWRUaW1lc3RhbXAiIDogIjIwMTktMDEtMDFUMDg6MDA6MDEuMTIwMDAwIg0KfSAsDQp7DQouLi4gKGFub3RoZXIgSlNPTiByZWNvcmQpDQp9ICwNCi4uLiAobW9yZSBKU09OIHJlY29yZHMpDQpdDQo=