Thread与Runnable的基本区别
Thread是Java中表示线程的类,直接继承Thread类并重写run方法即可创建线程。Runnable是一个接口,需要实现run方法,并通过Thread类的构造函数传入Runnable实例来创建线程。
继承Thread类的方式简单直接,但Java不支持多重继承,限制了扩展性。实现Runnable接口更灵活,允许类继承其他类,同时实现多线程功能。
线程创建与启动
继承Thread类的方式:
java
class MyThread extends Thread {
public void run() {
System.out.println("Thread running");
}
}
MyThread t = new MyThread();
t.start();
实现Runnable接口的方式:
java
class MyRunnable implements Runnable {
public void run() {
System.out.println("Runnable running");
}
}
Thread t = new Thread(new MyRunnable());
t.start();
并发控制机制
synchronized关键字用于实现线程同步,可以修饰方法或代码块。修饰实例方法时,锁是当前实例对象;修饰静态方法时,锁是当前类的Class对象。
实例方法同步:
java
public synchronized void increment() {
count++;
}
代码块同步:
java
public void increment() {
synchronized(this) {
count++;
}
}
线程安全的数据结构
Java并发包提供了多种线程安全的集合类,如ConcurrentHashMap、CopyOnWriteArrayList等。这些类通过不同的并发策略实现了高性能的线程安全。
使用ConcurrentHashMap示例:
java
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("key", 1);
线程间通信
wait()、notify()和notifyAll()方法用于线程间通信,必须在同步代码块或方法中使用。wait()使当前线程等待,释放锁;notify()唤醒一个等待线程。
生产者消费者示例:
java
public synchronized void produce() throws InterruptedException {
while (queue.size() == MAX) {
wait();
}
queue.add(item);
notifyAll();
}
public synchronized void consume() throws InterruptedException {
while (queue.isEmpty()) {
wait();
}
queue.remove();
notifyAll();
}
线程池的使用
Executor框架提供了线程池管理功能,可以重用线程,减少创建和销毁线程的开销。常见的线程池类型包括FixedThreadPool、CachedThreadPool等。
创建固定大小线程池:
gitee.com/sadsadasdwe2/wvgreuxr/blob/master/sheng.md
gitee.com/sadsadasdwe2/wvgreuxr/blob/master/sheng878.md
gitee.com/sadsadasdwe2/wvgreuxr/blob/master/kol44.md
gitee.com/sadsadasdwe2/wvgreuxr/blob/master/niux.md
gitee.com/sadsadasdwe2/wvgreuxr/blob/master/dijiu.md
gitee.com/sadsadasdwe2/wvgreuxr/blob/master/liu.md
gitee.com/sadsadasdwe2/wvgreuxr/blob/master/iuijd.md
gitee.com/sadsadasdwe2/wvgreuxr/blob/master/chang.md
gitee.com/sadsadasdwe2/wvgreuxr/blob/master/jiu.md
gitee.com/sadsadasdwe2/wvgreuxr/blob/master/cood.md
gitee.com/sadsadasdwe2/wvgreuxr/blob/master/les.md
gitee.com/sadsadasdwe2/wvgreuxr/blob/master/gouh.md
gitee.com/sadsadasdwe2/wvgreuxr/blob/master/daijiji.md
gitee.com/sadsadasdwe2/wvgreuxr/blob/master/wuan.md
gitee.com/sadsadasdwe2/wvgreuxr/blob/master/fou.md
gitee.com/sadsadasdwe2/wvgreuxr/blob/master/gudeng.md
gitee.com/sadsadasdwe2/wvgreuxr/blob/master/ali.md
gitee.com/sadsadasdwe2/wvgreuxr/blob/master/jiuang.md
gitee.com/sadsadasdwe2/wvgreuxr/blob/master/wanwan.md
gitee.com/sadsadasdwe2/wvgreuxr/blob/master/chuang.md
java
ExecutorService executor = Executors.newFixedThreadPool(4);
executor.submit(() -> {
System.out.println("Task running");
});
executor.shutdown();
原子操作类
java.util.concurrent.atomic包提供了原子操作类,如AtomicInteger、AtomicLong等。这些类通过CAS(Compare-And-Swap)操作实现无锁线程安全。
使用AtomicInteger示例:
java
AtomicInteger counter = new AtomicInteger(0);
counter.incrementAndGet();