java中利用多线程对数组值进行修改,为什么不是想要的结果

java中利用多线程对数组值进行修改,为什么不是想要的结果,第1张

并不是输出不会出现你想要的,,多去找下线程方面的资料看看,,

没有得到你想要的值是因为线程执行顺序造成的,,首先你这个程序运行起来总共有三个线程

主线程,线程t1,线程t2

实际上cpu处理线程的时候并不是真正的同时进行,而是执行某个线程一段时间,然后在执行其他线程一段时间,一直这样循环下去

线程的执行顺序是不定的,不是每次都是t1先,t2后,执行顺序和线程的优先级有关系,在线程优先级都相同的情况下,执行权是随机分配的,,也就是说可能这次t1先执行,下次却是t2先执行,所以你要的结课是可能出现的,,但是不是每次都是你想要的结课,,而且一般情况下多线程并发访问数据的时候,我们都会做同步处理,避免数据出现紊乱,

当主线程随机到执行权,那么主线程先执行,所以这时候获取到的数据就可能是原始没改变的值,,当t1或t2随机到执行权,那么获取的数据就是被修改过的,,但是修改的结果是无规律的,,

下面是帮你修改了下的,,如果还不是你的结果,可以把Threadsleep(时间)中的时间调大一点

public class Happy

{

  static int arr[]={1,2,3,4,5};

  public static void result()

  {

      Bolg1 p1=new Bolg1(arr);

      Bolg2 p2=new Bolg2(arr);

      Thread t1=new Thread(p1);

      Thread t2=new Thread(p2);

      t1start();

      t2start();

  }

  public static void main(String[] args) throws Exception

  {

      Happyresult();

      Threadsleep(1000);// 暂停主线程1秒,,等待其他线程执行

      for(int m:arr)

      {

          Systemoutprintln(m+" ");

      }

  }

}

class Bolg1 implements Runnable

{

  int[] arr;

  public Bolg1(int[] arr)

  {

      thisarr=arr;

  }

  public void run()

  {

      for(int i=0;i<arrlength;i+=2)

      {

          arr[i]=10;

      }

  }

}

class Bolg2 implements Runnable

{

  int[] arr;

  public Bolg2(int[] arr)

  {

      thisarr=arr;

  }

  public void run()

  {

      for(int j=1;j<arrlength;j+=2)

      {

          arr[j]=11;

      }

  }

}

启动线程(&子程序1)

启动线程(&子程序2)

启动线程(&子程序3)

-------------------

子程序1

变量循环首(1,20,1,i)

列表框加入项目(数组[i])

变量循环尾

---------------

子程序2

变量循环首(21,40,1,i)

列表框加入项目(数组[i])

变量循环尾

----------

你可以在 *** 作数组的类中添加一个成员变量bool,在read函数的开始结束分别将bool置为true和false,clear中开始判断bool为true就sleep,为false再执行clear函数体。

两个线程访问同一个函数当然是加线程锁。

多线程读取文件在一块硬盘上没用,瓶颈在硬盘I/O,而不在CPU和内存。读取文件时,CPU不用复杂的计算工作,只是数据传输而已,多线程反而造成磁头来回移动,效率不高。如果是两块以上的硬盘,可以用不同的线程访问不同的硬盘,效率比单线程要高

而且多线程 *** 作同一文件除了效率还会有多线程问题,多个线程同时往数组里存数据还会有线程安全问题,如果不同步处理读取的文件就是错误的。

如果读取的话只能设置每个线程各自读取偏 移量

读取文件大小(比如大小是200K)。 2,启动5个线程,第一个线程读到40,第二个线程跳过40在读到80,总之得合理安排好各个线程读取的大小。这样才能不重复读取。大数据处理框架mapreduce原理和此类似

import javaio;

class DownThread extends Thread {

//定义字节数组(取水的竹筒)的长度

private final int BUFF_LEN = 32;

//定义读取的起始点

private long start;

//定义读取的结束点

private long end;

//读取文件对应的输入流

private InputStream is;

//将读取到的字节输出到raf中

private RandomAccessFile raf;

//构造器,传入输入流,输出流和读取起始点、结束点

public DownThread(long start, long end, InputStream is, RandomAccessFile raf) {

//输出该线程负责读取的字节位置

Systemoutprintln(start + "---->" + end);

thisstart = start;

thisend = end;

thisis = is;

thisraf = raf;

}

public void run() {

try {

isskip(start);

rafseek(start);

//定义读取输入流内容的的缓存数组(竹筒)

byte[] buff = new byte[BUFF_LEN];

//本线程负责读取文件的大小

long contentLen = end - start;

//定义最多需要读取几次就可以完成本线程的读取

long times = contentLen / BUFF_LEN + 4;

//实际读取的字节数

int hasRead = 0;

for (int i = 0; i < times; i++) {

hasRead = isread(buff);

//如果读取的字节数小于0,则退出循环!

if (hasRead < 0) {

break;

}

rafwrite(buff, 0, hasRead);

}

} catch (Exception ex) {

exprintStackTrace();

}

//使用finally块来关闭当前线程的输入流、输出流

finally {

try {

if (is != null) {

isclose();

}

if (raf != null) {

rafclose();

}

} catch (Exception ex) {

exprintStackTrace();

}

}

}

}

public class MutilDown {

public static void main(String[] args) {

final int DOWN_THREAD_NUM = 4;

final String OUT_FILE_NAME = "d:/copy勇敢的心rmvb";

InputStream[] isArr = new InputStream[DOWN_THREAD_NUM];

RandomAccessFile[] outArr = new RandomAccessFile[DOWN_THREAD_NUM];

try {

isArr[0] = new FileInputStream("d:/勇敢的心rmvb");

long fileLen = getFileLength(new File("d:/勇敢的心rmvb"));

Systemoutprintln("文件的大小" + fileLen);

//以输出文件名创建第一个RandomAccessFile输出流

outArr[0] = new RandomAccessFile(OUT_FILE_NAME, "rw");

//创建一个与文件相同大小的空文件

for (int i = 0; i < fileLen; i++) {

outArr[0]write(0);

}

//每线程应该读取的字节数

long numPerThred = fileLen / DOWN_THREAD_NUM;

//整个文件整除后剩下的余数

long left = fileLen % DOWN_THREAD_NUM;

for (int i = 0; i < DOWN_THREAD_NUM; i++) {

//为每个线程打开一个输入流、一个RandomAccessFile对象,

//让每个线程分别负责读取文件的不同部分。

if (i != 0) {

isArr[i] = new FileInputStream("d:/勇敢的心rmvb");

//以指定输出文件创建多个RandomAccessFile对象

outArr[i] = new RandomAccessFile(OUT_FILE_NAME, "rw");

}

if (i == DOWN_THREAD_NUM - 1) {

//最后一个线程读取指定numPerThred+left个字节

new DownThread(i numPerThred, (i + 1) numPerThred

+ left, isArr[i], outArr[i])start();

} else {

//每个线程负责读取一定的numPerThred个字节

new DownThread(i numPerThred, (i + 1) numPerThred,

isArr[i], outArr[i])start();

}

}

} catch (Exception ex) {

exprintStackTrace();

}

}

public static long getFileLength(File file) {

long length = 0;

//获取文件的长度

long size = filelength();

length = size;

return length;

}

}

以上就是关于java中利用多线程对数组值进行修改,为什么不是想要的结果全部的内容,包括:java中利用多线程对数组值进行修改,为什么不是想要的结果、求用易语言的多线程实现将数组里100个成员同时导入列表框中..、多线程分别调用不同函数去访问读写同一个数组该怎么避免冲突,该怎么使用临界区等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9412238.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存