并不是输出不会出现你想要的,,多去找下线程方面的资料看看,,
没有得到你想要的值是因为线程执行顺序造成的,,首先你这个程序运行起来总共有三个线程
主线程,线程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个成员同时导入列表框中..、多线程分别调用不同函数去访问读写同一个数组该怎么避免冲突,该怎么使用临界区等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)