首页 > 其他分享 >从零开始写多线程

从零开始写多线程

时间:2024-10-21 13:20:51浏览次数:6  
标签:count Thread int void 从零开始 线程 多线程 public

1. Java 多线程的基本概念
1.1 线程与进程
进程:是操作系统分配资源的基本单位,每个进程都有独立的内存空间。
线程:是进程内的一个执行单元,同一进程中的线程共享进程的内存空间,线程间的通信更为高效。
1.2 线程的好处
提高系统响应性:可以实现用户界面与后台处理的并发执行,使得程序即使在处理耗时操作时也能保持响应。
提高性能:充分利用多核处理器的能力,同时处理多个任务。
2. 创建线程的两种方式
2.1 继承 Thread 类
可以通过继承 Thread 类并重写 run() 方法来创建线程。

1class MyThread extends Thread {
2    @Override
3    public void run() {
4        System.out.println("Thread running...");
5    }
6    
7    public static void main(String[] args) {
8        MyThread thread = new MyThread();
9        thread.start(); // 启动线程
10    }
11}
2.2 实现 Runnable 接口
也可以实现 Runnable 接口,并将其实例作为参数传递给 Thread 的构造函数。

1class MyRunnable implements Runnable {
2    @Override
3    public void run() {
4        System.out.println("Runnable running...");
5    }
6    
7    public static void main(String[] args) {
8        Thread thread = new Thread(new MyRunnable());
9        thread.start();
10    }
11}
3. 线程的生命周期
线程的生命周期包括以下几个阶段:

新建 (NEW):当一个线程对象被创建但尚未启动时。
就绪 (RUNNABLE):线程被启动后,等待 CPU 时间片。
运行 (RUNNABLE):线程获得了 CPU 时间片并开始执行。
阻塞 (BLOCKED):线程因等待某种条件(如 I/O 操作或同步锁)而暂时停止运行。
等待/休眠 (WAITING):线程因等待特定事件的发生(如 wait() 方法)而暂停运行。
定时等待 (TIMED_WAITING):线程因等待一定时间(如 sleep() 方法)而暂停运行。
终止 (TERMINATED):线程执行完毕或被异常终止。
4. 线程同步
4.1 同步锁
为了保证多线程环境下对共享资源的正确访问,可以使用同步锁(Synchronized)来保护临界区。

1public class Counter {
2    private int count = 0;
3    
4    public synchronized void increment() {
5        count++;
6    }
7    
8    public synchronized int getCount() {
9        return count;
10    }
11}
4.2 volatile 关键字
volatile 关键字可以用来标记一个变量是共享的,确保了对变量的可见性和禁止指令重排。

1public class Counter {
2    private volatile int count = 0;
3    
4    public void increment() {
5        count++;
6    }
7    
8    public int getCount() {
9        return count;
10    }
11}
4.3 Lock 接口
Lock 接口提供了更灵活的锁定机制,可以实现更复杂的同步策略。

1import java.util.concurrent.locks.Lock;
2import java.util.concurrent.locks.ReentrantLock;
3
4public class Counter {
5    private int count = 0;
6    private final Lock lock = new ReentrantLock();
7    
8    public void increment() {
9        lock.lock();
10        try {
11            count++;
12        } finally {
13            lock.unlock();
14        }
15    }
16    
17    public int getCount() {
18        return count;
19    }
20}
5. 线程间通信
5.1 wait() 和 notify()
wait() 和 notify() 方法可以用来实现线程间的通信。

1public class Counter {
2    private int count = 0;
3    private final Object monitor = new Object();
4    
5    public void increment() {
6        synchronized (monitor) {
7            count++;
8            monitor.notify();
9        }
10    }
11    
12    public void decrement() {
13        synchronized (monitor) {
14            while (count == 0) {
15                try {
16                    monitor.wait();
17                } catch (InterruptedException e) {
18                    e.printStackTrace();
19                }
20            }
21            count--;
22        }
23    }
24}
5.2 生产者-消费者模式
生产者-消费者模式是一种经典的线程协作模型,通过队列来实现生产者和消费者之间的解耦。

1import java.util.concurrent.BlockingQueue;
2import java.util.concurrent.LinkedBlockingQueue;
3
4public class ProducerConsumerDemo {
5    private static final BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10);
6    
7    public static void main(String[] args) {
8        Thread producer = new Thread(() -> {
9            try {
10                for (int i = 0; i < 100; i++) {
11                    queue.put(i);
12                    System.out.println("Produced: " + i);
13                }
14            } catch (InterruptedException e) {
15                e.printStackTrace();
16            }
17        });
18        
19        Thread consumer = new Thread(() -> {
20            try {
21                for (int i = 0; i < 100; i++) {
22                    int item = queue.take();
23                    System.out.println("Consumed: " + item);
24                }
25            } catch (InterruptedException e) {
26                e.printStackTrace();
27            }
28        });
29        
30        producer.start();
31        consumer.start();
32    }
33}
6. 线程池
线程池可以有效地管理线程,避免频繁创建和销毁线程所带来的开销。

1import java.util.concurrent.ExecutorService;
2import java.util.concurrent.Executors;
3
4public class ThreadPoolDemo {
5    public static void main(String[] args) {
6        ExecutorService executor = Executors.newFixedThreadPool(5);
7        
8        for (int i = 0; i < 10; i++) {
9            executor.submit(() -> {
10                System.out.println(Thread.currentThread().getName() + " is running");
11            });
12        }
13        
14        executor.shutdown();
15    }
16}
7. 线程中断
线程中断是一种通知线程终止的方式。

1public class ThreadInterruptDemo {
2    public static void main(String[] args) throws InterruptedException {
3        Thread thread = new Thread(() -> {
4            try {
5                while (!Thread.currentThread().isInterrupted()) {
6                    Thread.sleep(1000);
7                    System.out.println("Running...");
8                }
9            } catch (InterruptedException e) {
10                System.out.println("Interrupted!");
11                Thread.currentThread().interrupt(); // 重置中断标志
12            }
13        });
14        
15        thread.start();
16        Thread.sleep(5000);
17        thread.interrupt();
18    }
19}
8. 线程安全的容器
Java 提供了一些线程安全的容器类,如 Vector、ConcurrentHashMap 等。

1import java.util.concurrent.ConcurrentHashMap;
2
3public class ThreadSafeContainerDemo {
4    private static ConcurrentHashMap<Integer, String> map = new ConcurrentHashMap<>();
5    
6    public static void main(String[] args) {
7        Thread t1 = new Thread(() -> {
8            for (int i = 0; i < 100; i++) {
9                map.put(i, "Value " + i);
10            }
11        });
12        
13        Thread t2 = new Thread(() -> {
14            for (int i = 0; i < 100; i++) {
15                map.remove(i);
16            }
17        });
18        
19        t1.start();
20        t2.start();
21    }
22}

  

标签:count,Thread,int,void,从零开始,线程,多线程,public
From: https://www.cnblogs.com/stevenduxiang/p/18489281

相关文章

  • 高效并行计算:使用C++中的std::thread实现多线程编程
    解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界在现代计算中,随着多核处理器的普及,如何充分利用硬件资源以提升程序性能成为关键问题之一。C++标准库提供了丰富的多线程支持,其中std::thread是用于实现并发计算的核心工具之一。通过合理的多线程设计,程序可以实现......
  • 多线程交替顺序打印ABC的多种方式
    面试题:有3个独立的线程,一个只会输出A,一个只会输出B,一个只会输出C,在三个线程启动的情况下,请用合理的方式让他们按顺序打印ABC。使用lock,Conditionimportjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.lock......
  • 从多线程到 epoll:如何优雅地处理高并发请求?
    文章参考于:小林coding最近在学习操作系统,服务器与客户端之间的通信离不开socket编程。然而,基于TCP的socket编程在默认情况下只能实现一对一的通信,因为它采用同步阻塞模型。在服务器处理完当前客户端的请求之前,无法响应其他客户端的请求。这种方式效率不高,显然浪费了......
  • 新手必看详细搭建网站全流程教程从零开始快速入门
    1.确定网站需求网站类型:静态网站、动态网站(如博客、电商网站)功能需求:基本展示、用户注册、支付功能等预计访问量:低流量、中流量、高流量2.购买云服务器选择云服务提供商:阿里云、腾讯云、AWS等选择服务器配置:CPU:1核或2核内存:1GB或2GB存储:20GB或50GB带宽:1Mbps或5Mbp......
  • STA模型、同步上下文和多线程、异步调度
    写过任何桌面应用,尤其是WinForm的朋友们应该见过,Main函数上放置了一个[STAThread]的Attribute。而且几乎所有的桌面应用框架,都是由同一个UI线程来执行渲染操作的,这表现为从其他线程修改控件的值就会抛异常:awaitTask.Run(()=>control.Content="");//throwsexception大家......
  • 从零开始学习VLSI设计(二)Yosys工具进阶
    系列文章目录从零开始学习VLSI设计(一)Yosys工具概述目录系列文章目录前言一、使用xdot,以图像形式查看电路逻辑二、使用Yosys进行逻辑优化1.opt指令逻辑优化2.share指令资源共享总结参考文献前言  今天更新Yosys的进阶操作,包括如何使用xdot查看电路图及对数字......
  • 多线程
    第七章——多线程1、多线程概述1、多线程概述进程:正在运行的程序,是系统进行资源分配和调用的独立单位。每一个进程都有它自己的内存空间和系统资源。线程:是进程中的单个顺序控制流,是一条执行路径一个进程如果只有一条执行路径,则称为单线程程序。一个进程如果有多条执行路......
  • C#从零开始学习(用unity探索C#)(unity Lab1)
    初次使用Unity本章所有的代码都放在https://github.com/hikinazimi/head-first-CsharpUnity的下载与安装从unity官网下载UnityHubUnity的使用安装后,注册账号,下载unity版本,然后创建3d项目设置窗口界面布局3D对象的创建点击对象,然后点击MoveGuzmo,就可......
  • 从零开始精通RTSP之深入理解RTP协议
    一、RTP协议概述1.定义   RTP(RealTimeTransportProtocol)即实时传输协议,它是一种用于在IP网络上对多媒体数据进行实时传输的标准协议。在RTSP(RealTimeStreamingProtocol)的应用场景中,RTP起到了至关重要的作用,负责传输实际的音视频数据。2.协议结构   RTP头部......
  • java_day18_多线程、线程安全问题、死锁、等待唤醒机制
    一、线程1、多线程进程:是系统进行资源分配和调用的独立单位,每一个进程都有它自己的内存空间和系统资源。举例:IDEA,阿里云盘,wegame,steam线程:是进程中的单个顺序控制流,是一条执行路径一个进程如果只有一条执行路径,则称为单线程程序。一个进程如果有多条执行......