java中如何实现两个线程同时写一个文件
- 更新时间:2020-03-11 15:59:52
- 编辑:邴懿轩
本文实例为大家分享了java两个线程同时写一个文件的具体代码,供大家参考,具体内容如下
1.多线程
线程是程序执行流的最小单元。是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。
多线程的意义就在于使得一个应用程序有多条执行路径,从而提高进程(程序)的执行效率。
2.JAVA中的多线程
2.1概述实现
JAVA实现多线程的方法有三种: 1)继承Thread实现多线程。2)通过实现Runnable接口方式实现多线程。3)使用ExecutorService、Callable、Future实现有返回结果的多线程。这三种方法的具体实现,在此先不一一赘述,网上有很多有关的博客,不明白的朋友可以去看看。
JAVA程序的运行原理便是命令去启动JVM,JVM会启动一个进程,该进程会启动一个主线程。然而JVM的启动必然也是多线程的,一般情况下,它最低有两个线程启动了:主线程和垃圾回收线程。
2.2线程生命周期
1)新建 2)就绪 3)运行 4)阻塞 5)死亡
2.3线程的优先级
线程的调度有两种方式:1)分时调度。2)抢占式调度。JAVA采用的是后者,默认情况下,线程去抢占资源(CPU执行权)。我们可以通过setPriority方法,设置线程的优先级,默认是5,范围为1-10。但是一般情况下,光是设置线程的优先级,不能使得线程有序且高效执行,所以我们还需要学习更多的方法与原理机制。
2.4线程的控制(常见方法)
1)休眠线程 2)加入线程 3)礼让线程 4)后台线程 5)终止线程
2.5多线程的安全问题
在多线程的环境下,大多时候都是会共享数据,存在多条语句操作共享数据,这样很多时候会出现脏数据。所以为了解决线程的安全的问题,我们可以通过synchronized同步锁对象达到我们的目的。
1)同步代码块
synchronized(对象) { 需要被同步的代码块 }
2)同步方法
把同步加在方法上,这里的锁对象是this。
3)静态同步方法
把同步加在方法上。这里的锁是当前类的字节码文件。
PS:JDK5以后的针对线程的锁定操作和释放操作: Lock锁。
3.多线程写一个文件
如何实现多线程同时或读或写一个文件呢?我们都知道,一个文件在同一时间只能被一个线程读(写),如果要两个线程同时写一个文件,如何有效有序的分配这个临界资源呢?
下面我将通过一个例子,阐述我的解决方法 -——沉睡唤醒机制。
需求:两个线程写一个TXT文件,线程1:I love you 线程2:so do I 。保证线程1、2有序执行,一句I love you,对应一句so do I。
第一步,先创建WRFile类。这一步是关键的。
package cn.Thread.love; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; public class WRFile { //String str; boolean flag; public WRFile() { } public synchronized void read1() { if(this.flag) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } RandomAccessFile ra = null; try { ra = new RandomAccessFile("love.txt", "rw"); ra.seek(ra.length()); ra.writeBytes("I love you"); ra.writeBytes("\r\n"); } catch (Exception e) { e.printStackTrace(); } finally { try { ra.close(); } catch (IOException e) { e.printStackTrace(); } } //修改标记 唤醒线程 this.flag = true; this.notify(); } public synchronized void read2() { if(!this.flag) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } RandomAccessFile ra = null; try { ra = new RandomAccessFile("love.txt", "rw"); ra.seek(ra.length()); ra.writeBytes("so do I"); ra.writeBytes("\r\n"); } catch (Exception e) { e.printStackTrace(); } finally { try { ra.close(); } catch (IOException e) { e.printStackTrace(); } } //修改标记 唤醒线程 this.flag = false; this.notify(); } }
第二步,创建我们的两个线程类,第一个FirstThread。
package cn.Thread.love; public class FirstThread implements Runnable { private WRFile wr = new WRFile(); public FirstThread(WRFile wr) { this.wr = wr; } @Override public void run() { while(true) { wr.read1(); } } }
第二个SecondThread
package cn.Thread.love; public class SecondThrad implements Runnable{ private WRFile wr = new WRFile(); public SecondThrad(WRFile wr) { this.wr = wr; } @Override public void run() { while(true) { wr.read2(); } } }
第三步,main方法启动线程
package cn.Thread.love; public class LoveDemo { public static void main(String[] args) { //创建数据对象 WRFile wr = new WRFile(); //设置和获取类 FirstThread ft = new FirstThread(wr); SecondThrad st = new SecondThrad(wr); //线程类 Thread th1 = new Thread(ft); Thread th2 = new Thread(st); //启动线程 th1.start(); th2.start(); } }
即可实现两个线程同时(有序)写一个文件,两个以上,或是其他操作也可参考这种思想去实现。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。
相关教程
-
Java多线程用法的实例详解
这篇文章主要介绍了Java多线程用法的实例详解的相关资料,希望通过本文大家能够理解掌握这部分内容,需要的朋友可以参考下
发布时间:2019-08-29
-
成都Java培训那里好
适合自己的,为了快速学习Java,一个好的成都Java培训,既要包含当前企业所用的核心技术点,融入热门潮流技术,这里需要了解一点,调查分析显示,很多人选择参加培训班不仅是为了学习知识,先来免费学习15天,学完自主选择是否继续Java学习
发布时间:2021-08-13
-
Web前端开发精品课 JavaScript基础教程
《JavaScript基础教程》 共分为2大部分,第1部分是JavaScript基础知识,主要学习JavaScript基础概念如变量、运算符、表达式等。第二部分是JavaScript进阶知识,主要学习DOM、事件操作以及各种开发技
大小:9.7 MB前端电子书
-
Java高并发编程详解:多线程与架构设计
《Java高并发编程详解》立足于线程源码剖析,从基础入手,逐层渐进深入,环环紧扣,针对技术细节进行了细致归纳,在解读源码的时候又引入了优秀的架构设计。
大小:120.77 MBJava编程电子书
-
第三方JavaScript编程
第三方JavaScript应用程序是自包含的应用组件,通常都是小脚本或插件,能够为Web站点增加功能。它们往往是由独立的组织或个人提供的,代码和文件都是来自于远程的Web地址。 《第三方JavaS
大小:74.2 MBJavaScript电子书
-
OCA JAVA SE 7 PROGRAMMER I认证学习指南
大小:36060 MB MJAVA认证考试
-
RxJava响应式编程
主要介绍如何使用RxJava进行响应式编程,从响应式编程与RxJava的概念,到RxJava的操作符和源码,以及各种Scheduler的特点和适用场景,均做了较细致的讲解,是架构师提升必备入门书籍
大小:71.1 MBRxJava电子书
-
Java程序员面试笔试宝典
本书是程序员求职面试笔试必备图书,以独特的视角对面试过程中求职者存在的各类问题进行了深度剖析,是一本适合计算机相关专业毕业生阅读的求职指导用书
大小:73.4 MBJava面试电子书
-
移动网页设计与开发:HTML5+CSS3+JavaScript
将落伍的网址打导致更为灵便、友善,而且令其充分运用不一样机器设备和电脑浏览器的与众不同优点。根据《移动网页设计与开发HTML5+CSS3+JavaScript》,您将为投身第一线开发充分准备! *內容
大小:30.2 MB移动开发电子书
-
JavaScript网页动画设计
JavaScript网页动画设计 由业界先进的动画库Velocity。js的作者所著,书中内容共分为8章,简明扼要地总结了在网页上使用动画的技术技巧,让读者掌握如何有效利用动画实现无与伦比的用户体验
大小:26 MBJavaScript电子书
-
代码不朽:编写可维护软件的10大要则(Java版)
本书提供代码示例,能够让读者一步步了解到如何对代码进行重构,从大量实践项目中提取出了编写可维护软件的10个最佳原则,帮助读者编写出高质量、简洁的代码,开发出松耦合、高可维护
大小:25.1 MBJava电子书