多线程编程题
<h2>两个线程轮流打印数字</h2>
<pre><code class="language-java">public class Main {
private static AtomicInteger num = new AtomicInteger(0);
private static volatile boolean flag = false;
private static int count = 100;
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
while (num.get() < count) {
if (!flag && num.getAndIncrement()%2 == 0) {
System.out.println("Thread 1 开始打印,打印数字是:" + num.get());
flag = true;
}
}
});
Thread t2 = new Thread(() -> {
while (num.get() < count) {
if (flag && num.getAndIncrement()%2 == 1) {
System.out.println("Thread 2 开始打印,打印数字是:" + num.get());
flag = false;
}
}
});
t1.start();
t2.start();
}
}</code></pre>
<h2>线程轮流依次执行</h2>
<pre><code class="language-java">public class Main {
public static void main(String[] args) {
MyThread t1 = new MyThread("t1");
MyThread t2 = new MyThread("t2");
MyThread t3 = new MyThread("t3");
try {
t1.start();
t1.join();
t2.start();
t2.join();
t3.start();
t3.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
static class MyThread extends Thread {
private int count = 5;
public MyThread(String name) {
super(name);
}
@Override
public void run() {
System.out.println("线程" + getName() + "执行开始");
for (int i=0;i<count;i++) {
System.out.println("线程" + getName() + "打印数字:" + i);
}
System.out.println("线程" + getName() + "执行结束");
}
}
}</code></pre>
<h2>三个线程轮流依次执行5次</h2>
<pre><code class="language-java">public class Main {
private static AtomicInteger num = new AtomicInteger(0);
private static volatile int flag = 1;
private static int count = 15;
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
while (num.get() < count) {
if (flag == 1 && num.getAndIncrement()%3 == 0) {
System.out.print("A");
flag = 2;
}
}
});
Thread t2 = new Thread(() -> {
while (num.get() < count) {
if (flag == 2 && num.getAndIncrement()%3 == 1) {
System.out.print("B");
flag = 3;
}
}
});
Thread t3 = new Thread(() -> {
while (num.get() < count) {
if (flag == 3 && num.getAndIncrement()%3 == 2) {
System.out.print("C");
flag = 1;
}
}
});
t1.start();
t2.start();
t3.start();
}
}</code></pre>
<h2>两个线程交替输出12A34B...5152Z</h2>
<pre><code class="language-java">public class Main {
private static AtomicInteger num = new AtomicInteger(0);
private static volatile int flag = 1;
private static volatile char character = 'A';
private static int count = 52;
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
while (num.get() < count) {
if (flag == 1 && num.getAndIncrement()%2 == 0) {
System.out.print(num.get());
System.out.print(num.get() + 1);
flag = 2;
}
}
});
Thread t2 = new Thread(() -> {
while (num.get() < count) {
if (flag == 2 && num.getAndIncrement()%2 == 1) {
System.out.print(character);
character = (char)(character +1);
flag = 1;
}
}
});
t1.start();
t2.start();
}
}</code></pre>
<h2>子线程执行2次,主线程执行4次,如此循环5次</h2>
<pre><code class="language-java">public class Main {
private static AtomicInteger num = new AtomicInteger(0);
private static volatile boolean flag = false;
private static int count = 10;
private static int subCount = 2;
private static int mainCount = 4;
public static void main(String[] args) {
new Thread(() -> {
while (num.get() < count) {
if (!flag && num.getAndIncrement()%2 == 0) {
for (int i=0;i<subCount;i++) {
System.out.println("子线程开始打印,打印数字是:" + i);
}
flag = true;
}
}
}).start();
while (num.get() < count) {
if (flag && num.getAndIncrement()%2 == 1) {
for (int j=0;j<mainCount;j++) {
System.out.println("主线程开始打印,打印数字是:" + j);
}
flag = false;
}
}
}
}</code></pre>