Java 多线程IO简单实用Demo

多线程主要作用是充分利用Cpu,而不在于它的乱序性。本Demo不讲它竞争什么的、之前看过乱序打印ABC的例子什么的,那些有意义吗?

本Demo 是多线程打印文件夹下的文件,主要实现是用数组存放文件,一个游标遍历。

我们需要考虑在什么时候加互斥访问,本例用synchronized .

先考虑单线程的流程:客户端启动-->读取文件下的文件放到数组(IO)--> 取游标打印 ,游标加1 -- > 改文件写文件(IO) -- 重复上两步至越界 -- 结束

多线程时显然需要在“取游标打印 ,游标加1 ”这一步加互斥,扔到一个方法里面加synchronized修饰符。

代码:

Client.java

package mutilThread;

import java.io.File;

/**
 * 多线程打印文件夹下的文件名
 *
 */
public class Client {

	private static  File[] files ;//文件数组
	private static int curr = 0; //文件数组的游标,增加时需考虑线程安全

	public static void main(String[] args) {

		File folder = new File("C:/test");

		if (folder.isDirectory()) {
			files = folder.listFiles();

		}

		Thread t = null;
		for (int i = 0; i < 5; i++) {

			t = new Thread(new ReadThread());
			t.start();
			System.out.println(t.getName() + " started.");
		}
	}

	// getter/setter
	public static int getCurr() {
		return curr;
	}

	public static void setCurr(int curr) {
		Client.curr = curr;
	}

	public static File[] getFiles() {
		return files;
	}
}

ReadThread.java

package mutilThread;

import java.io.File;

public class ReadThread implements Runnable {

	private boolean flag = true; // 线程运行标志,true 线程则一直运行,false则 while 循环停止,run
								// 执行完毕,线程自然结束

	@Override
	public void run() {

		while (flag) {
			File file = getFile();
			if (file != null) {
				System.out.println(file.toString() + " by "
						+ Thread.currentThread().getName());

				// 实际需求会有一些IO操作,如修改再保存之类,用计算来睡眠模拟
				try
				{
					Thread.sleep((long)(Math.random() * 1000));
				}
				catch (InterruptedException e)
				{
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * synchronized,此方法互斥访问 
	 * @return 一个文件
	 */
	private synchronized File getFile() {

		int curr = Client.getCurr();
		File[] files = Client.getFiles();

		// 游标越界则停止
		if (curr > files.length - 1) {

			System.out.println("finished by "
					+ Thread.currentThread().getName());
			stopThread();// 停止线程
			return null;
		}

		File file = files[curr];
		Client.setCurr(++curr);

		return file;
	}

	private void stopThread() {

		this.flag = false;
	}
}

停止线程使用while(flag) 方式,以后就这样套着写一个Thread即可

我们执行一个任务的时候,需要加速,那就多线程吧。对可能会因并发而错乱的地方加同步即可,简单实用。

Java 多线程IO简单实用Demo

时间: 2024-08-24 11:54:59

Java 多线程IO简单实用Demo的相关文章

Java多线程之简单的线程同步实例

数据类: package Thread.MyCommon; public class Data { public int num = 0; public synchronized int getEven() { ++num; Thread.yield();//让另外线程先执行,加大测试效果几率 ++num; return num; } } 线程类: package Thread.MyCommon; public class myThread implements Runnable { priva

Java 多线程安全问题简单切入详细解析

线程安全 假如Java程序中有多个线程在同时运行,而这些线程可能会同时运行一部分的代码.如果说该Java程序每次运行的结果和单线程的运行结果是一样的,并且其他的变量值也都是和预期的结果是一样的,那么就可以说线程是安全的. 解析什么是线程安全:卖电影票案例 假如有一个电影院上映<葫芦娃大战奥特曼>,售票100张(1-100号),分三种情况卖票: 情况1 该电影院开设一个售票窗口,一个窗口卖一百张票,没有问题.就如同单线程程序不会出现安全问题一样. 情况2 该电影院开设n(n>1)个售票窗口

java编程IO简单回顾和学习

java编程IO操作必不可少的,很久不玩IO,回顾一下,写了几个小程序,记录一下,方便查阅和学习. 1.给出一个整数数组,将其写入一个文件,再从文件中读出,并按整数大小逆序打印. package com.io.test; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.FileWriter; i

Java多线程——&lt;三&gt;简单的线程执行:Executor

一.概述 按照<Java多线程——<一><二>>中所讲,我们要使用线程,目前都是显示的声明Thread,并调用其start()方法.多线程并行,明显我们需要声明多个线程然后都调用他的start方法,这么一看,似乎有些问题:第一.线程一旦多了,声明势必是个问题:第二.多线程启动如果通过手动执行的话,那可能一个线程已经跑完了,另外一个还没起来(我推测可能会出现这个问题).所以,我们在想,如果有个管家,能够帮我们管理这么多线程,只需要把我们定义的任务交给管家,管家就能够帮我们

使用Java多线程模简单拟售票系统

创建单个"火车票类" package date0804.demo3; /** * 票 * @author zzw922cn * */ public final class Ticket { private final String name; public Ticket(String name) { super(); this.name = name; } public String getName() { return name; } } 火车票DB的构建 采用静态工厂生产火车票的模

Java多线程实现简单的售票程序

设计一个多线程程序如下:设计一个火车售票模拟程序.假如火车站要有100张火车票要卖出,现在有5个售票点同时售票,用5个线程模拟这5个售票点的售票情况 1.要求打印出每个售票点所卖出的票号 2.各售票点不能售出相同票号的火车票 package com.hebust.java.third; import java.util.Random; public class SaleTicket implements Runnable { public int total; public int count;

java多线程实现简单队列

1.创建Queue.java public class Queue { private LinkedList<Object> list = new LinkedList<Object>() ; private final int minSize = 0 ; ; private final int maxSize ; private AtomicInteger count = new AtomicInteger(0) ; public Queue(int size){ this.ma

LitJson 简单实用Demo

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等).这些特性使JSON成为理想的数据交换语言.易于人阅读和编写,同时也易于机器解析和生成. 如果曾经使用过J

java多线程那点事

屌丝程序员们对自己的技术能力总是毫不掩饰的高调,更有甚者每当完成一个简单的功能或算法实现,恨不得从工位上跳起来,生怕谁不知道一样,心情能理解,但个人完全鄙视这种行为.说到底,大家日常的coding,大多在单线程下执行,代码书写的顺序即执行的顺序,很多时候也是我们解决问题的逻辑顺序.有很多代码,如果考虑多线程,从并发的角度去实现,伪"大牛"们可能就要原形毕露了,很多同学更是束手无策.那么,多线程真的那么可怕么?接下来本人 把自己的一些理解分享出来,如有不当,欢迎指正. java多线程问题