- 浏览: 1117665 次
文章分类
- 全部博客 (379)
- S2SH (16)
- stuts2 (0)
- java语言 (81)
- JSP (17)
- <html>元素 (11)
- javaweb (4)
- web容器 (3)
- ext (23)
- javaScript (48)
- ant (1)
- liferay (1)
- sql (9)
- css (42)
- 浏览器设置 (3)
- office_world (1)
- eclipse (4)
- 其它 (28)
- 操作系统 (5)
- android (6)
- Struts2 (11)
- RegEx (3)
- mysql (5)
- BigDATA (1)
- Node.js (1)
- Algorithm (10)
- Apache Spark (1)
- 数据库 (5)
- linux (2)
- git (1)
- Adobe (3)
- java语言,WebSocket (1)
- Maven (3)
- SHELL (1)
- XML (2)
- 数学 (2)
- Python (2)
- Java_mysql (1)
- ReactJS (6)
- 养生 (4)
- Docker (1)
- Protocols (3)
- java8 (2)
- 书籍 (1)
- Gradle (2)
- AngularJS (5)
- SpringMVC (2)
- SOAP (1)
- BootstrapCSS (1)
- HTTP协议 (1)
- OAuth2 (1)
最新评论
-
Lixh1986:
Java并发编程:自己动手写一把可重入锁https://blo ...
Java之多线程之Lock与Condition -
Lixh1986:
http://win.51apps.com.cn/https: ...
temp -
ztwsl:
不错,支持很好
HttpServletRequest和ServletRequest的区别 -
guodongkai:
谢谢您能将知识精华汇编总结,让初学者们从原理中学会和提高。
javaScript之function定义 -
kangwen23:
谢谢了,顶顶
struts2中的ValueStack学习
1、实现线程
第一步:实现方法体
两种方法:
1)继承 java.lang.Thread 类,重写其 run() 方法。
不推荐使用该方法,因为只能继承一个类,就不能继承其它的类了。
2)实现 java.lang.Runnable 接口,实现其 run() 方法。
接口可以实现多个。
其实 Thread 类也是实现了 java.lang.Runnable 接口。
第二步:运行
new 一个 java.lang.Thread 类,并调用其 start() 方法
说明:
在 jdk 1.5 中可以使用 java.util.concurrent 包中的类进行线程操作。
请阅读 java.util.concurrent包之Execuotor系列文章
2、例子:
例子一:
例子二:
尚学堂马士兵老师的:生产者消费者(注意英文注释的内容)
-
第一步:实现方法体
两种方法:
1)继承 java.lang.Thread 类,重写其 run() 方法。
不推荐使用该方法,因为只能继承一个类,就不能继承其它的类了。
2)实现 java.lang.Runnable 接口,实现其 run() 方法。
接口可以实现多个。
其实 Thread 类也是实现了 java.lang.Runnable 接口。
第二步:运行
new 一个 java.lang.Thread 类,并调用其 start() 方法
说明:
在 jdk 1.5 中可以使用 java.util.concurrent 包中的类进行线程操作。
请阅读 java.util.concurrent包之Execuotor系列文章
2、例子:
例子一:
/* 设计2个线程 其中: 1. 一个线程对数值增加 1 2. 一个线程对数值减少 1 3. 每个线程最多累计增加或减少9次 */ public class TestSyncThread { public static void main(String[] args){ int initNumber = 10; Counter c = new Counter(initNumber); Thread t1 = new IncThread(c); Thread t2 = new Thread(new DecInterface(c)); t1.start(); t2.start(); } } class Counter{ private static int num = 0; public static int max = 100; public Counter (int init){ num = init; } public synchronized void inc(int i){ num ++; System.out.print("inc: "); System.out.println(num); if(i%10 == 9){ this.notify(); try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } if(i==max){ this.notify(); } } public synchronized void dec(int i){ num --; System.out.print("dec: "); System.out.println(num); if(i%10 == 9){ this.notify(); try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } if(i == max){ this.notify(); } } } /* 1、线程类中不要有 synchronized, wait(), notify() 等。这些是针对对象的。写在对象中。 2、wait(), notify(), notifyAll() 方法需要放在 synchronized 修饰的方法体内, 否则会提示:java.lang.IllegalMonitorStateException 异常:该线程没有锁定对象却释放对象的锁。 而线程执行 synchronized 修饰的语句块时,会拥有这个对象的锁。 3、如果出现 java.lang.IllegalMonitorStateException: 换句话说就是该线程未获得该对象监视器(即锁),而去调用 wait(), notify() 等操作。 */ class IncThread extends Thread{ Counter c; public IncThread( Counter c){ this.c = c; } @Override public void run() { for(int i=0;i<=Counter.max;i++){ System.out.print("i: "+i+ " - "); c.inc(i); } } } class DecInterface implements Runnable{ Counter c; public DecInterface( Counter c){ this.c = c; } @Override public void run() { for(int i=0; i<=Counter.max; i++){ System.out.print("i: "+i+ " - "); c.dec(i); } } }
例子二:
尚学堂马士兵老师的:生产者消费者(注意英文注释的内容)
public class ProduceConsumer{ public static void main(String[] args){ SyncStack ss = new SyncStack(); Producer pro = new Producer(ss); Consumer con = new Consumer(ss); new Thread(pro).start(); new Thread(con).start(); } } class Product{ int id; public Product(int id){ this.id = id; } public String toString(){ return "Product:" + id; } } class SyncStack{ int index = 0; Product[] arrPro = new Product[6]; public synchronized void push(Product p){ while (index == arrPro.length){ try { this.wait(); // Causes the current thread to wait. /* The current thread must own this object's monitor(lock), then the thread releases ownership of this monitor(lock) and waits until another thread notifies threads which waiting on this object's monitor to wake up, either through a call to the notify() method or the notifyAll() method. The thread waits until it can re-obtain ownership of the monitor and resumes execution. */ } catch (InterruptedException e) { e.printStackTrace(); } } arrPro[index] = p; index++; this.notify(); // send notification to threads to wake up for this object. /* Wakes up a single thread that is waiting on this object's monitor. If any threads are waiting on this object, one of them is chosen to be awakened. The choice is arbitrary and occurs at the discretion of the implementation. [NOTE: A thread waits on an object's monitor by calling one of the wait() methods.] The awakened thread will not be able to proceed until the current thread relinquishes(quit) the lock on this object. ( so the "notify()" method can be put on the top of this method, it works fine. ). The awakened thread will compete in the usual manner with any other threads that might be actively competing to synchronize on this object; for example, the awakened thread enjoys no reliable privilege or disadvantage in being the next thread to lock this object. This method should only be called by a thread that is the owner of this object's monitor. A thread becomes the owner of the object's monitor in one of three ways( Only one thread at a time can own an object's monitor. ): 1. By executing a synchronized instance method of that object. 2. By executing a synchronized statement body that synchronizes on the object. 3. By executing a synchronized static method of that class (for objects of type Class). */ } public synchronized Product pop(){ this.notify(); while (index == 0){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } index--; return arrPro[index]; } } class Producer implements Runnable{ SyncStack ss = null; public Producer(SyncStack ss){ //持有SyncStack的一个引用 this.ss = ss; } @Override public void run() { for(int i=0; i<20; i++){ Product p = new Product(i); ss.push(p); System.out.println("生产了:" + p); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } class Consumer implements Runnable{ SyncStack ss = null; public Consumer(SyncStack ss){ //持有SyncStack的一个引用 this.ss = ss; } @Override public void run() { for(int i=0; i<20; i++){ Product p = ss.pop(); System.out.println("消费了:" + p); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } }
-
发表评论
-
java 将文件夹所有的文件合并到指定的文件夹下
2020-06-30 19:17 1095场景:将文件夹所有的文件合并到指定的文件夹下 另外:如果想效 ... -
多线程-线程池的四种创建方式
2020-04-01 18:38 521多线程-线程池的四种创建方式 https://blog.cs ... -
Java基础之:nio
2019-11-13 15:38 511一、理论讲解: 史上最强Java NIO入门:担心从入门到放弃 ... -
Java 分布式之:RPC 基本概念
2019-11-13 15:07 486转载: https://www.jianshu.com/p/ ... -
Java之 volatile 关键字原理详解
2019-11-07 15:36 579一、什么是 volatile ? ... -
POI实现excell批注背景图片(仿html浮窗显示图片)
2019-10-21 08:17 727POI实现excell批注背景图片(仿html浮窗显示图片) ... -
Java之设计模式之 Observer 观察者
2019-07-04 17:21 1109观察者设计模式 Java 已经实现了该模式,并且提供了使用类 ... -
HashMap, LinkedHashMap and TreeMap
2019-03-01 11:04 687https://stackoverflow.com/a/177 ... -
Java lib 操作 excel 插入图片
2019-01-19 12:46 888https://poi.apache.org/componen ... -
数据库连接池C3P0
2018-05-29 16:50 908一、名字的由来 很多 ... -
Java8之集合(Collection)遍历 forEach()、stream()
2018-05-29 14:39 20761package java8.collections; ... -
Junit Vs main on "java.util.concurrent.Executors"
2017-11-10 16:44 856Same code with different result ... -
Java之大数据学习路线
2017-11-03 10:08 5734三个月大数据研发学习 ... -
Java中创建对象的5种方式
2017-10-26 14:21 846一、Java之5种创建对象的方式 ————————————— ... -
Log4j和Slf4j的比较
2017-06-23 12:41 1422一直搞不清 Log4j 和 SLF4j 的关系。今天才若有所 ... -
Java之Java7新特性之try资源句式
2017-04-20 14:58 5393Java之Java7新特性之try资源句式 一、【try资源 ... -
Java之 java.util.concurrent 包之ExecutorService之submit () 之 Future
2017-03-04 21:27 3847一、如何使用 ExecutorService.submit() ... -
Java之 java.util.concurrent 包之Executor与ExecutorService
2017-03-04 21:18 2711一、问题: execute() 与 submit() 的区别? ... -
JAVAEE之单用户登录
2017-02-05 11:55 1065单用户登录是系统中数据一直性的解决方案之一。 问题背景: 试 ... -
Java之多线程之线程池之线程重复使用
2017-02-04 13:33 5577一、问题背景 在使用多线程时,如果要开启一个任务,则就需要新 ...
相关推荐
总之,Java模拟线程并发是一个广泛且深入的话题,涵盖了线程的创建、同步、管理和高级并发工具的使用。理解和熟练应用这些知识,能够帮助开发者编写出高效、安全的多线程程序。在实际开发中,应根据具体需求选择合适...
在Java编程中,多线程并发是...总之,Java的多线程并发实例可以帮助我们更好地理解和实践线程控制、同步机制以及经典的设计模式,提升我们的编程能力。通过不断学习和实践,我们可以编写出高效、安全的多线程并发程序。
Java多线程与并发编程是Java开发中至关重要的一部分,它涉及到如何高效地利用CPU资源,以实现程序的并行执行。在操作系统层面,多任务和多进程是通过分配不同的内存空间来实现的,而线程则共享同一进程的内存,这...
Java线程与并发编程实践是Java开发者必备的技能之一,特别是在多核处理器和高并发应用环境中,有效地管理和利用线程能极大地提升程序的性能。本书《java线程与并发实践编程》由Jeff Friesen撰写,2017年2月出版,...
4. **线程同步与死锁**:当多个线程访问共享资源时,为了避免数据不一致问题,需要使用同步机制。但同步不当可能会导致死锁,这是多个线程互相等待对方释放锁的情况。 5. **线程通信**:线程间的通信主要通过共享...
资源名称:Java多线程与并发库高级应用视频教程22集资源目录:【】01传统线程技术回顾【】02传统定时器技术回顾【】03传统线程互斥技术【】04传统线程同步通信技术【】04传统线程同步通信技术_分割纪录【】05线程...
在现代软件开发中,特别是在Java这样的主流编程语言中,多线程并发技术是提高程序执行效率、优化资源利用的关键手段之一。本篇文章将深入探讨Java中的多线程并发机制,并通过具体的示例来帮助读者更好地理解和掌握这...
但同时,多线程并发也会引入一些问题,如数据竞争和同步问题。 为了解决这些问题,Java提供了多种同步机制。`synchronized`关键字用于控制对共享资源的访问,确保同一时间只有一个线程可以执行特定代码块,从而避免...
Java多线程与并发是Java开发中的重要领域,尤其在现代高性能应用中,对多核处理器的充分利用和高效系统设计离不开并发技术。本主题主要基于《Java多线程编程核心技术》和《Java+7并发编程实战手册》两本书籍的核心...
Java多线程与并发编程是Java语言中用于处理多任务执行的关键技术,它能够帮助开发者设计出能够有效应对高并发请求的应用程序。在现代的线上(Online)和离线(Offline)应用中,合理利用多线程技术可以大幅提高系统...
在Java编程环境中,...总之,使用Java线程实现数据库主从同步更新是一种常见且实用的技术手段,它涉及到多线程编程、数据库操作、事务管理等多个方面。理解和掌握这些知识点对于开发高可用性的分布式系统至关重要。
本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则...
在Java编程领域,多线程和高并发是两个至关重要的概念,它们对于构建高效、可扩展的系统至关重要。本文将围绕“Java多线程高并发相关资料收集”这一主题,详细探讨这两个领域的核心知识点。 首先,多线程是指在单个...
java面试视频资源JAVA并发编程之多线程并发同步业务场景与解决方案提取方式是百度网盘分享地址
内容概要:本文详细介绍了Java多线程的基础概念和关键技术点。首先解释了线程的基本概念、线程与进程的区别及其不同状态。接着,通过三种方式创建线程(继承Thread类、实现Runnable接口、使用Callable和Future接口)...
Java 多线程之并发锁 Java 中的多线程编程是指在一个程序中同时运行多个线程,以提高程序的执行效率和响应速度。在多线程编程中,线程间的同步是非常重要的,因为不同的线程可能会同时访问同一个共享资源,导致数据...
Java多线程并发实战与源码分析是Java开发中至关重要的一部分,它涉及到程序性能优化、系统资源高效利用以及复杂逻辑的正确同步。本书主要聚焦于Java多线程的基础理论和实际应用,虽然书中实例和源码相对较少,但仍然...
在使用`java.util.concurrent`包时,了解并发基础知识是必要的,包括线程的创建、同步、中断和异常处理。线程的创建可以通过Thread类或Runnable接口实现,同步可以通过`synchronized`关键字、Lock接口(如...
线程基础是理解并发编程的关键,它涉及到线程的状态转换、创建与使用方式、同步与协作机制等方面。 线程有五种基本状态: 1. 新建(New):线程被创建但尚未启动。 2. 可运行(Runnable):线程可能正在运行,也...
Java多线程与并发编程是Java开发中不可或缺的一部分,它涉及到如何高效地利用CPU资源,实现并发执行多个任务。在操作系统层面,多线程是为了提高系统利用率,使得多个任务能够"同时"执行,但实际上,由于CPU的时钟...