Java 多线程编程给互联网开发带来了非常大的便利,可以提高程序的并发性和效率。在 Java 中,创建线程有两种方式:继承 Thread 类和实现 Runnable 接口。其中实现 Runnable 接口是比较常用的一种方式,可以将任务交给 Executor 执行器来执行。
Java 的多线程编程应用场景很多,如,在网络编程中,服务器需要同时处理多个客户端请求,解决这个问题可以使用多线程技术;在GUI界面开发中,一些操作需要占用大量的时间,为了不使得界面阻塞,需要使用多线程技术;在数据处理中,可以采用多线程技术去并行处理数据等等。
对于多线程编程,需要格外注意线程安全性问题,如何有效地保证多个线程之间的数据同步与共享是一个需要认真考虑的问题。因此,通过仔细学习 Java 多线程编程相关知识,可以更好地理解并应用多线程技术,提高程序的效率和可靠性。
例如
java实现顺序打印ABC
可以使用多种方式实现 ABC 的顺序打印,下面介绍两种实现方法:
方法一:使用 synchronized、wait、notifyAll
class PrintThread implements Runnable {
private String name;
private Object prev;
private Object self;
public PrintThread(String name, Object prev, Object self) {
this.name = name;
this.prev = prev;
this.self = self;
}
@Override
public void run() {
int count = 5;
while (count > 0) {
synchronized (prev) {
synchronized (self) {
System.out.print(name);
count--;
self.notifyAll();
}
try {
if (count == 0) {
prev.notifyAll();
} else {
prev.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public class Test {
public static void main(String[] args) throws Exception {
Object a = new Object();
Object b = new Object();
Object c = new Object();
PrintThread pt1 = new PrintThread("A", c, a);
PrintThread pt2 = new PrintThread("B", a, b);
PrintThread pt3 = new PrintThread("C", b, c);
new Thread(pt1).start();
Thread.sleep(100);//确保按顺序A、B、C执行
new Thread(pt2).start();
Thread.sleep(100);//确保按顺序A、B、C执行
new Thread(pt3).start();
}
}
方法二:使用 CountDownLatch
import java.util.concurrent.CountDownLatch;
public class Test {
static final Integer COUNT = 5;
static final String[] CHARACTERS = {"A", "B", "C"};
static final CountDownLatch LATCH_A = new CountDownLatch(1);
static final CountDownLatch LATCH_B = new CountDownLatch(1);
public static void main(String[] args) {
Thread t1 = new Thread(new PrintThread(LATCH_A, LATCH_B, CHARACTERS[0], COUNT));
Thread t2 = new Thread(new PrintThread(LATCH_B, LATCH_A, CHARACTERS[1], COUNT - 1));
Thread t3 = new Thread(new PrintThread(LATCH_B, LATCH_A, CHARACTERS[2], COUNT - 2));
t1.start();
t2.start();
t3.start();
}
static class PrintThread implements Runnable {
CountDownLatch currentLatch;
CountDownLatch nextLatch;
String character;
Integer count;
public PrintThread(CountDownLatch currentLatch, CountDownLatch nextLatch, String character, Integer count) {
this.currentLatch = currentLatch;
this.nextLatch = nextLatch;
this.character = character;
this.count = count;
}
@Override
public void run() {
for (int i = 0; i < count; i++) {
try {
currentLatch.await();
System.out.print(character);
nextLatch.countDown();
if (i == count - 1 && nextLatch != LATCH_A) {
LATCH_A.countDown();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
以上两种方法均可以实现顺序打印 ABC 的功能。其中,第一种方法使用了 synchronized、wait、notifyAll 实现线程控制,第二种方法则使用了 CountDownLatch 来实现。