Java多线程编程技巧详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java多线程编程技巧详解
Java是一种广泛使用的编程语言,而多线程编程则是Java中一个重要的开发领域。
在多线程编程中,开发者需要了解并掌握一定的技巧,以避免线程之间的冲突和死锁等问题。
本文将详细介绍Java多线程编程的常用技巧,帮助开发者轻松掌握多线程编程的精髓。
一、线程的创建与启动
1. 继承Thread类创建线程:直接继承Thread类,并覆盖run()方法实现线程主体。
```
public class MyThread extends Thread{
public void run(){
//线程执行体
}
}
MyThread myThread = new MyThread();
myThread.start();
```
2. 实现Runnable接口创建线程:实现Runnable接口,并在类中实例化一个Thread对象。
```
public class MyRunnable implements Runnable{
public void run(){
//线程执行体
}
}
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
```
二、线程的处理与管理
1. 同步方法:synchronized关键字用于保护共享数据不被多个线程同时访问。
```
public class SynchronizedDemo implements Runnable {
private int count;
public synchronized void run() {
for(int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()+":"+(count++));
}
}
}
SynchronizedDemo target = new SynchronizedDemo();
Thread thread1 = new Thread(target, "A");
Thread thread2 = new Thread(target, "B");
thread1.start();
thread2.start();
```
2. 锁对象:使用互斥锁对象来控制线程访问共享资源的方式。
```
public class LockDemo implements Runnable {
private ReentrantLock lock = new ReentrantLock();//创建锁对象 int count;
public void run() {
try {
lock.lock();
for(int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()+":"+(count++));
}
}finally {
lock.unlock();
}
}
}
LockDemo target = new LockDemo();
Thread thread1 = new Thread(target, "A");
Thread thread2 = new Thread(target, "B");
thread1.start();
thread2.start();
```
3. 线程等待:使用wait()方法使线程等待,使用notify()方法唤醒等待线程。
```
public class WaitNotifyDemo {
public synchronized void waitMethod() {
System.out.println(Thread.currentThread().getName()+"方法执行开始...");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"方法执行结束...");
}
public synchronized void notifyMethod() {
System.out.println(Thread.currentThread().getName()+"方法执行开始...");
try {
Thread.sleep(2000);//主动休眠2秒钟
} catch (InterruptedException e) {
e.printStackTrace();
}
notify();//唤醒等待线程
System.out.println(Thread.currentThread().getName()+"方法执行结束...");
}
}
WaitNotifyDemo target = new WaitNotifyDemo();
Thread thread1 = new Thread(() -> target.waitMethod(),"等待线程");
Thread thread2 = new Thread(() -> target.notifyMethod(),"唤醒线程");
thread1.start();
thread2.start();
```
三、线程池
1. 线程池基本用法
```
public class ThreadPoolDemo {
public static void main(String[] args) {
ExecutorService executorService =
Executors.newFixedThreadPool(2);//创建线程池,线程池中最多存在2个线程
for (int i = 1; i <= 5; i++) {
executorService.submit(() -> {
System.out.println(Thread.currentThread().getName() + "执行任务...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
executorService.shutdown();
}
}
```
2. 线程池拒绝策略
在创建线程池对象的时候可以传入一个拒绝策略来处理任务队列满了之后的情况。
拒绝策略一共有四种,分别是:
- AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
- CallerRunsPolicy:由调用线程池的线程来提供服务。
- DiscardOldestPolicy:丢弃队列中最旧的未处理任务,将新任务放入队列。
- DiscardPolicy:不处理,丢弃掉。
```
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 5000,
LISECONDS, new LinkedBlockingQueue<>(12),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardPolicy());//设置拒绝策略```
四、线程安全
1. 不可变对象
不可变对象指一旦创建就不可以被修改的对象,线程安全性得
以保证。
Java中的String、Integer、Long、Sha1等类都是不可变
对象。
2. 可变对象
可变对象需要进行同步处理以保证线程安全性。
常用的同步处
理方式包括使用synchronized关键字、互斥锁、volatile关键字等。
总结:本文从线程创建和启动、线程处理和管理、线程池和线
程安全三个方面详细介绍了Java多线程编程的常用技巧。
对于开
发者而言,掌握Java多线程编程技巧可以有效提高程序的性能并
保证程序的稳定性,是非常重要的技能。
希望读者通过本文的学习,能够轻松掌握Java多线程编程的精髓,为自己的职业发展打
下坚实的基础。