这次说的就是想要线程自己去找事情做的一个方法,逻辑思想就是,当有人像我们的容器中放置一个新的消息,那么唤醒所有线程,这个时候取消息加锁并且位移+1,然后处理线程自己思考是否还有消息应该处理,如果没有进入等待空间,如果有责继续处理!
(这种处理思想是考虑到线程共享内存的原理,否则是无法实现的)
package threadtest2; public class Main { public static void main(String[] args){ Channel channel = new Channel(5); //生成一个新的channel对象,设置容器线程量为5 channel.startWorkers(); //开始所有的工作线程 new ClientThread("Alice", channel).start(); //启动客户端模拟器来放置消息 new ClientThread("Bobby", channel).start(); //同上 new ClientThread("Chris", channel).start(); //同上 } }
package threadtest2; public class Main { public static void main(String[] args){ Channel channel = new Channel(5); //生成一个新的channel对象,设置容器线程量为5 channel.startWorkers(); //开始所有的工作线程 new ClientThread("Alice", channel).start(); //启动客户端模拟器来放置消息 new ClientThread("Bobby", channel).start(); //同上 new ClientThread("Chris", channel).start(); //同上 } }
这类的代码其实都是简单
package threadtest2; import java.util.Random; public class Request { private final String name; //委托者名称 private final int number; //请求编号 private static final Random random = new Random(); //生成一个随机数 public Request(String name, int number){ this.name = name; this.number = number; } /**work线程调用使用的解决方法,就是简单的显示**/ public void execute(){ System.out.println(Thread.currentThread().getName() + "executes" + this); try{ Thread.sleep(random.nextInt(1000)); }catch(InterruptedException e){ } } public String toString(){ return "[ Request from]" + name + "No." + number +"]"; } }
package threadtest2; import java.util.Random; public class Request { private final String name; //委托者名称 private final int number; //请求编号 private static final Random random = new Random(); //生成一个随机数 public Request(String name, int number){ this.name = name; this.number = number; } /**work线程调用使用的解决方法,就是简单的显示**/ public void execute(){ System.out.println(Thread.currentThread().getName() + "executes" + this); try{ Thread.sleep(random.nextInt(1000)); }catch(InterruptedException e){ } } public String toString(){ return "[ Request from]" + name + "No." + number +"]"; } }
package threadtest2; import java.util.Random; /**模拟客户端发送请求**/ public class ClientThread extends Thread{ private final Channel channel; //创建处理模块实例 private static final Random random = new Random(); //生成随机数 public ClientThread(String name, Channel channel){ super(name); //继承线程类构造方法 this.channel = channel; } /**实现run方法**/ public void run(){ try{ /**该进程一直递增,并调用channel put方法来放置新的消息进去,然后随机休眠等待**/ for(int i = 0; true; i++){ Request request = new Request(getName(), i); channel.putRequest(request); Thread.sleep(random.nextInt(1000)); } }catch(InterruptedException e){ } } }
这中简单的小示例代码,经过我们的修改,可以制作成处理很复杂逻辑的代码版本,例如,我们将存储消息的数组加以分类,让线程按照类别去寻找消息处理等等!
相关推荐
Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...
《Java线程实战手册》是Java并发编程领域的一份重要参考资料,主要针对Java开发者,旨在帮助他们深入理解和熟练掌握Java中的多线程技术。虽然这里只提供了第一章的内容,但这一章通常会涵盖基础理论和核心概念,对于...
Java线程有五种基本状态:新建(New)、可运行(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Terminated)。这些状态之间的转换是通过调用特定的方法,如start()、sleep()、join()、wait()、notify()等...
### Java多线程分页查询知识点详解 #### 一、背景与需求分析 在实际的软件开发过程中,尤其是在处理大量数据时,如何高效地进行数据查询成为了一个关键问题。例如,在一个用户众多的社交平台上,当用户需要查看...
在Java编程中,多线程是一种常见的技术,用于提高程序的执行效率,特别是在处理大量并发任务时。在本项目“多线程页面析取源码”中,开发者使用了多线程来并行抓取网页内容,从而加速了数据获取过程。这个实现依赖于...
Java线程提供了异常处理机制,可以使用try-catch-finally块来捕获和处理异常。如果同步失败,可能需要回滚主数据库的事务,或者标记异常并尝试在后续同步周期中再次处理。 5. **性能优化**: 为提高同步效率,可以...
4. **线程优先级与守护线程**:Java线程有优先级之分,可以影响调度,但实际效果取决于操作系统。守护线程(Daemon Thread)是一种特殊类型的线程,当它是系统中唯一运行的线程时,JVM会自动退出。 5. **并发集合与...
### JAVA线程深入了解 #### 一、JAVA线程启动方式详解 ##### 1. 利用`Thread`类的子类启动线程 在Java中,可以通过继承`Thread`类来创建一个新的线程。这种方式相对直观,易于理解。具体做法是创建一个`Thread`类...
不同的平台,内存模型是不一样的,但是jvm的内存模型规范是统一的。...JVM定义了自己的内存模型,屏蔽了底层平台内存管理细节,对于java开发人员,要清楚在jvm内存模型的基础上,如果解决多线程的可见性和有序性。
- **线程优先级**:Java线程具有优先级,但实际效果取决于操作系统的调度策略。 - **线程调度**:操作系统负责决定何时切换线程执行,Java提供了Thread.yield()和Thread.sleep()方法影响线程调度。 6. **实战示例...
在Java编程语言中,创建线程是实现并发执行任务的关键步骤。Java提供了两种主要的方法来创建线程,分别是直接继承自`Thread`类和实现`Runnable`接口。这两种方法各有其特点和适用场景。 1. **继承Thread类**: 当...
线程的优先级也是重要概念,Java中的Thread类定义了线程优先级,但实际调度仍然取决于操作系统。优先级高的线程通常有更高的执行机会,但不保证。 此外,线程间的协作也是关键。wait()和notify()方法用于线程间通信...
Java程序中的多线程技术是实现并发操作的关键,尤其在处理并发读写数据时,如在本例中,我们有两条线程分别负责读取和写入学生的成绩...通过学习这个程序,我们可以深入理解Java线程的使用以及并发编程中的核心概念。
Java线程具有优先级,`Thread.NORM_PRIORITY`是默认优先级,可以通过`setPriority()`设置优先级。但优先级并不保证线程的执行顺序,因为线程调度取决于JVM和操作系统。 6. **线程池** Java的`ExecutorService`和`...
Java线程的调度是通过操作系统的线程调度器来完成的,可以是抢占式调度或者合作式调度,具体取决于运行Java的平台。在Java中,线程的状态包括新建、可运行、运行、阻塞、等待、超时等待和终止。线程可以通过`sleep()...
- **Java中的线程模型**:Java线程模型主要基于`Thread`类和`Runnable`接口。创建线程有两种基本方法:继承`Thread`类或实现`Runnable`接口。 #### 多线程在.NET里如何工作? 在.NET框架中,线程通过`System....
- Java线程有多种状态:新建 (`NEW`)、就绪 (`RUNNABLE`)、阻塞 (`BLOCKED`)、等待 (`WAITING`)、超时等待 (`TIMED_WAITING`) 和终止 (`TERMINATED`)。 - **状态转换**: - 当线程被创建但尚未启动时,它的状态是...
首先,Java作为一种面向对象的编程语言,其多线程特性使得它在处理并发任务时表现出色。在Java中,我们可以使用`Thread`类或者实现`Runnable`接口来创建线程。多线程允许程序同时执行多个任务,提高系统资源的利用率...
中断和异常处理也是Java线程的重要方面。Thread类提供了interrupt()方法来中断线程,但线程是否真正停止取决于run()方法如何响应InterruptedException。通常,我们需要在run()方法中检查并处理中断标志,以优雅地...