当前位置:首页 > 编程教程 > java技术文章 > java两个线程同时写一个文件

java中如何实现两个线程同时写一个文件

  • 发布时间:
  • 作者:码农之家
  • 点击:185

这篇文章主要知识点是关于java、两个线程、文件、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

Java工程师修炼之道
  • 类型:Java大小:87.17 MB格式:PDF作者:杭建
立即下载

java两个线程同时写一个文件

本文实例为大家分享了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)死亡

java两个线程同时写一个文件

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 相关电子书
学习笔记
网友NO.984741

java多线程下载文件原理解析

原理解析:利用RandomAccessFile在本地创建一个随机访问文件,文件大小和服务器要下载的文件大小相同。根据线程的数量(假设有三个线程),服务器的文件三等分,并把我们在本地创建的文件同样三等分,每个线程下载自己负责的部分,到相应的位置即可。 示例图: 示例demo import java.io.InputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.URL;public class MutilDownload { private static String path = "http://192.168.80.85:8080/test.doc"; private static final int threadCount = 3; public static void main(String[] args) { try { URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); int responseCode = conn.getResponseCode(); if (responseCode == 200) { int contentLength = conn.getContentLength(); System.out.println("length" + contentLength); RandomAccessFile rafAcce……

网友NO.854814

RxJava2.x+ReTrofit2.x多线程下载文件的示例代码

写在前面: 接到公司需求:要做一个apk升级的功能,原理其实很简单,百度也一大堆例子,可大部分都是用框架,要么就是HttpURLConnection,实在是不想这么干。正好看了两天的RxJava2.x+ReTrofit2.x,据说这俩框架是目前最火的异步请求框架了。固本文使用RxJava2.x+ReTrofit2.x实现多线程下载文件的功能。 如果对RxJava2.x+ReTrofit2.x不太了解的请先去看相关的文档。 大神至此请无视。 思路分析: 思路及其简洁明了,主要分为以下四步 1.获取服务器文件大小. 2.根据文件大小规划线程数量. 3.根据下载内容合并为完整文件. 4.调用安装,安装apk. 功能实现 来,接下来是你们最喜欢的撸代码环节 1.首先看引用 compile 'io.reactivex:rxjava:latest.release' compile 'io.reactivex:rxandroid:latest.release' //network - squareup compile 'com.squareup.retrofit2:retrofit:latest.release' compile 'com.squareup.retrofit2:adapter-rxjava……

网友NO.849049

java多线程有序读取同一个文件

本人刚参加工作,面试的时候遇四道笔试题,其中就有这道多线程有序读取文件的题目,初看时拿不准,感觉会,又感觉不会。于是放弃了这道题,今天闲下来好好做一遍。 //定义一个runnable接口的实现类import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;import java.io.RandomAccessFile;public class RunnableImpl implements Runnable{ //定义文件读取的游标位置 private static int now=0; //定义即将被读取的文件 static File file=new File("source/error.log"); //使用io包中的RandomAccessFile类,支持文件的随机访问 static RandomAccessFile raf=null; //定义每次读取的字节数 final static int len=256; RunnableImpl() throws IOException{ raf=new RandomAccessFile(file, "rw"); } @Override public void run() { while(true){ try { //synchronized实现多线程的同步 synchronized (raf) { //将文件内容读取到b字节数组中 byte[] b = new byte[len]; //设置游标……

<
1
>

Copyright 2018-2020 www.xz577.com 码农之家

版权投诉 / 书籍推广 / 赞助:520161757@qq.com