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)死亡

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();
 }

}

即可实现两个线程同时(有序)写一个文件,两个以上,或是其他操作也可参考这种思想去实现。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java多线程读写文件示例

    复制代码 代码如下: package com.ysh.file; import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock; import c

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

    本文实例为大家分享了java两个线程同时写一个文件的具体代码,供大家参考,具体内容如下 1.多线程    线程是程序执行流的最小单元.是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源.一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行.由于线程之间的相互制约,致使线程在运行中呈现出间断性.线程也有就绪.阻塞和运行三种基本状态.就绪状态是指线程具备运行的所有条

  • python 写一个文件分发小程序

    一.概述 该小程序实现从源端到目标端的文件一键拷贝,源端和目标段都在一台电脑上面,只是目录不同而已 二.参数文件说明 1. settings.txt的说明 a. 通过配置settings.txt,填源端和目标端路径,如果用反斜杠结尾表示填的是文件夹,如果不是反斜杠结尾则代表填的是文件 b. 如果是按日期自动生成的文件夹,则用{YYYYMMMDD}或{MMDD}等替代 c. 文件支持*匹配任意名字 d. 在no_create_ok_file组中,表示不生成ok标识,在create_ok_file组

  • Java超详细教你写一个斗地主洗牌发牌系统

    目录 一.斗地主 1.前言 2.介绍 3.图解 二.准备牌 1.代码示例 2.数据展示 三.洗发牌与排序 代码示例 四.看牌(打印到控制台) 1.代码示例 2.展示 六.总结 一.斗地主 1.前言 相信每位看过<赌神>的同学都知道,里面有一种神奇的类似于魔术的力量. 没错!我们今天要说的这个神奇的东西就是:特异功能(不是) 就是:斗地主的洗牌发牌系统!!! 2.介绍 扑克牌经典游戏"斗地主"相信很多人都会玩,这次就用Java语言来编写一个斗地主的洗牌发牌程序,要求按照斗地主

  • Java超详细教你写一个银行存款系统案例

    目录 一.银行存取款 1.前言 2.描述 3.分析 二.银行账户类(BankAccount) 1.方法 2.变量 3.代码示例 三.测试类(Test) 1.要求 2.代码示例 3.运行结果 四.总结 一.银行存取款 1.前言 毕竟谁不喜欢钱呢!(不是) 我看谁不喜欢在知识的海洋中遨游! 2.描述 银行存取款的流程是人们非常熟悉的事情,用户可以在银行对自己的资金账户进行存款.取款.查询余额等操作,极大的便利了人们对自己资金的管理. 编程要求:使用Java知识编写一个银行存取款的程序,实现存取款功能

  • Java超详细教你写一个学籍管理系统案例

    目录 前言 一.学籍管理系统功能介绍 1.介绍 2.学籍管理系统的主要功能图示 3.代码编写的思路 二.定义学生类 1.学生类名称: 2.包含的成员变量 3.构造方法 4.成员方法 5.代码示例 三.主界面的代码编写 1.思路 2.代码示例 四.系统功能方法的实现 1.添加学生信息的代码编写 1.1 思路 1.2 添加学生信息的方法说明图 1.3 代码示例 2.查看学生信息的代码编写 2.1 思路 2.2 查看学生信息的方法说明图 2.3 代码示例 3.删除学生信息的代码编写 3.1 思路 3.

  • Java超详细教你写一个网络购书系统案例

    目录 一.购书系统 1.前言 2.功能介绍 3.分析 二.图书类(Book) 1.类名及属性 2.代码示例 三.订单项类(OrderItem) 1.类名及属性 2.代码示例 四.订单类(Order) 1.类名及属性 2.代码示例 五.测试类(Test) 1.编写打印图书信息的方法 2.编写购买图书的方法 3.编写打印订单信息方法 4.编写main方法 六.总结 一.购书系统 1.前言 伴随着互联网的飞速发展,网络购书系统作为电子商务的一种形式,正以其高效.低成本的优势逐步成为新兴的经营模式,人们

  • java中表示一个文件的File类型详解

    前言 从本篇文章开始,我们将开启对 Java IO 系统的学习,本质上就是对文件的读写操作,听上去简单,其实并不容易.Java 的 IO 系统一直在完善和改进,设计了大量的类,也只有理解了这些类型被设计出来的意义以及各自的应用场景,才能提升文件 IO 的理解. 那么,第一步就是要解决如何表示一个文件的问题,Java 世界中「万物皆对象」,如何将一个实际磁盘文件或目录对应到一个 Java 对象则是我们首要的问题. Java 中使用 File 来抽象一个文件,无论是普通文件或是目录,都可对应于一个

  • Java 用两个线程交替打印数字和字母

    前一段时间听马士兵老师讲课,讲到某公司的一个面试,两个线程,其中一个线程输出ABC,另一个线程输出123,如何控制两个线程交叉输出1A2B3C,由于本人多线程掌握的一直不是很好,所以听完这道题,个人感觉收获良多,这是一个学习笔记.这道题有多种解法,不过有些属于纯炫技,所以只记录常见的三种解法.首先看第一种 1. park 和 unpark package cn.bridgeli.demo;   import com.google.common.collect.Lists;   import ja

  • Java多线程之线程的创建

    一.三种创建方式 基于什么创建 创建的方式 Thread类 继承Thread类 Runnable接口 实现Runnable接口 callable接口 实现callable接口 二.通过Thread类创建 2.1 步骤 自定义线程类继承Thread类 重写run()方法,编写线程执行体(当成main()方法用) 创建线程对象,调用start()方法启动线程 2.2 案例 创建两个线程,其中一个线程打印100以内的偶数,另一个线程打印100以内的奇数 //主方法 public class Demo0

  • 详解Java编程中线程的挂起、恢复和终止的方法

    有时,线程的挂起是很有用的.例如,一个独立的线程可以用来显示当日的时间.如果用户不希望用时钟,线程被挂起.在任何情形下,挂起线程是很简单的,一旦挂起,重新启动线程也是一件简单的事. 挂起,终止和恢复线程机制在Java 2和早期版本中有所不同.尽管你运用Java 2的途径编写代码,你仍需了解这些操作在早期Java环境下是如何完成的.例如,你也许需要更新或维护老的代码.你也需要了解为什么Java 2会有这样的变化.因为这些原因,下面内容描述了执行线程控制的原始方法,接着是Java 2的方法. Jav

随机推荐