📅  最后修改于: 2023-12-03 15:02:04.596000             🧑  作者: Mango
Java并发是指通过多线程技术,使Java程序能够同时执行多个任务。在现代计算机中,多个CPU核心和超线程技术变得普遍,因此,使用Java并发技术可以更好地利用计算机资源,提高程序的执行效率和响应能力。
本教程将向你介绍Java中的并发编程基础知识、线程安全与同步、线程池、并发工具等内容。
线程是指共享同一进程空间的不同执行流。在Java中,线程是通过java.lang.Thread
类来实现的,可以通过继承Thread
类或实现Runnable
接口来创建线程。
public class MyThread extends Thread {
@Override
public void run() {
System.out.println("执行线程任务");
}
}
public class Main {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}
在多线程环境下,多个线程可能会同时对同一个共享资源进行读写,这时就可能出现数据不一致或安全问题。线程安全就是保证多个线程访问共享资源时的正确性和一致性。
Java提供了使用synchronized
关键字来实现同步访问共享资源的机制。
public class MyStack {
private int index = 0;
private int[] data = new int[10];
public synchronized void push(int num) {
data[index++] = num;
}
public synchronized int pop() {
return data[--index];
}
}
上述代码中,push
和pop
方法上都加了synchronized
关键字,这样就可以保证多个线程在访问push
和pop
方法时是同步的,避免了数据不一致的问题。
线程池是实现多线程的一种有效方式,通过线程池可以控制线程的数量和执行顺序,提高程序的性能和效率。
Java提供了使用ThreadPoolExecutor
类来实现线程池的机制。
ThreadPoolExecutor executor = new ThreadPoolExecutor(
5, 10, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(100));
executor.execute(new RunnableTask());
上述代码中,ThreadPoolExecutor
的构造函数接受五个参数:
在Java中,还提供了一些并发工具,如CountDownLatch
、Semaphore
、CyclicBarrier
等,用于协调多个线程的运行和处理共享资源的情况。
CountDownLatch latch = new CountDownLatch(5);
for (int i = 0; i < 5; i++) {
new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName() + " 开始执行");
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " 执行完毕");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
latch.countDown();
}
}).start();
}
latch.await();
System.out.println("所有线程执行完毕");
上述代码中,使用CountDownLatch
实现了等待所有线程执行完毕后再继续执行的机制。
以上是Java并发基础知识的简单介绍,接下来我们将继续介绍Java并发高级内容,如原子操作、Lock机制、Fork/Join框架等。