Java多线程,求助
java吧
全部回复
仅看楼主
level 8
我想AFK 楼主
一个数组中存放了5个数,使用多线程,一个线程掉数组中的一个数进行自加运算
比如:a[]={1,2,3,4,5}
线程1:1+1
线程2:2+2
线程3:3
+3

线程4:4+4
线程5:5+5
求代码!!
2014年04月11日 07点04分 1
level 6
等我有时间
2014年04月11日 07点04分 2
好啊,希望你时间快点来
2014年04月11日 07点04分
level 8
我想AFK 楼主
来个有时间的大婶 ,在线等
2014年04月11日 07点04分 3
level 8
我想AFK 楼主
别沉
2014年04月11日 08点04分 4
level 8
楼主头像很熟悉,我
看看你的
问题来
2014年04月11日 08点04分 5
不能免费看啊 留下点什么
2014年04月11日 08点04分
回复 我想AFK :写好了,公司电脑渣渣,等下复制出来
2014年04月11日 08点04分
网速终于好了。我写的略微复杂些
2014年04月11日 08点04分
level 12
public static void main(String[] args){
final int[] num = {1,2,3,4,5};
for(int i = 0;i < num.length;i++){
final int f = i;
new Thread(new Runnable() {
public void run() {
System.out.println("线程" + num[f] + ":" + num[f] + "+" + num[f]);
}
}).start();
}
}
2014年04月11日 08点04分 6
多谢
2014年04月11日 08点04分
回复 我想AFK :问题又来了 ,主线程怎么等待子线程都结束了才结束呢?
2014年04月11日 09点04分
回复 我想AFK :什么是主线程?线程还有主线程和子线程这一说?
2014年04月11日 10点04分
回复 Viol_lion :姑且把main线程叫主线程吧
2014年04月11日 11点04分
level 8
我想AFK 楼主
为嘛 要用final
2014年04月11日 08点04分 7
下面的线程要用数组,所以不允许改变。
2014年04月11日 08点04分
回复 pascaljy :线程要调用的东西都必须加final?
2014年04月11日 08点04分
回复 我想AFK :匿名内部类调用外面的东西都是要加final的
2014年04月11日 08点04分
内部类线程(就是在一个类里面写线程的运行逻辑)用到外部类的局部变量,必须声明该变量为fianl表示不变,安全。如果是外部类的全局变量就不需要。
2014年04月11日 08点04分
level 8
第一个类用于记录数据
/**
* @ClassName: DataRecoder
* @PackageName: org.syy.threadadd
* @ProjectName: Test
*
* @Description: 数据记录
*
* @author syy
* @date 2014-4-11 下午4:08:52
* @version V1.0
*/
public class DataRecoder {
public static int[] DATA = {1, 2, 3, 4, 5};
}
第二个类用于执行任务逻辑,核心类
/**
* @ClassName: AddTask
* @PackageName: org.syy.threadadd
* @ProjectName: Test
*
* @Description: 自增任务
*
* @author syy
* @date 2014-4-11 下午4:10:06
* @version V1.0
*/
public class AddTask implements Runnable{
/**
* @Fields index : 需要计算的数组下标
*/
private int index = -1;
public AddTask(int index) {
this.index = index;
}
/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
@Override
public void run() {
if (-1 == index) {
System.out.println("下标错误!");
return;
}
// 赋初始值
int sum = DataRecoder.DATA[index];
// 统计计算次数
int count = 1;
while (true) {
// 自增计算
sum += DataRecoder.DATA[index];
System.out.println("线程" + Thread.currentThread().getId()
+ "\t参与计算的数为" + DataRecoder.DATA[index]
+ "\t第" + (count++) + "次计算的结果是:" + sum);
// 休息一会
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
第三个是测试类
/**
* @ClassName: RunTask
* @PackageName: org.syy.threadadd
* @ProjectName: Test
*
* @Description: TODO
*
* @author syy
* @date 2014-4-11 下午4:16:57
* @version V1.0
*/
public class RunTask {
public static void main(String[] args) {
for (int i=0; i<DataRecoder.DATA.length; i++) {
new Thread(new AddTask(i)).start();
}
}
}
2014年04月11日 08点04分 8
多谢
2014年04月11日 08点04分
回复 我想AFK :你我有缘
2014年04月11日 08点04分
回复 pascaljy :问题又来了 ,主线程怎么等待子线程都结束了才结束呢?
2014年04月11日 09点04分
回复 我想AFK :这需要统计子线程的状态,你确定需要这个需求?
2014年04月11日 09点04分
level 8
1.记录者添加运行线程数量
public class DataRecoder {
public static int[] DATA = {1, 2, 3, 4, 5};
/**
* @Fields RUNTHREADNUM : 当前跑起的子线程数量
*/
public static int RUNTHREADNUM = 0;
}
2. 执行任务时设置运行数量
public class RunTask {
public static void main(String[] args) {
for (int i=0; i<DataRecoder.DATA.length; i++) {
new Thread(new AddTask(i)).start();
// 一个线程运行,改变运行数量
DataRecoder.RUNTHREADNUM++;
}
while (0 < DataRecoder.RUNTHREADNUM) {
// System.out.println(DataRecoder.RUNTHREADNUM + "个子线程正在运行,请等待");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("所有子线程执行完毕,程序结束");
}
}
3.任务执行的核心逻辑中在任务结束时减少运行线程数量
public class AddTask implements Runnable{
/**
* @Fields index : 需要计算的数组下标
*/
private int index = -1;
public AddTask(int index) {
this.index = index;
}
/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
@Override
public void run() {
if (-1 == index) {
System.out.println("下标错误!");
return;
}
// 赋初始值
int sum = DataRecoder.DATA[index];
// 统计计算次数
int count = 1;
/*
* 只计算10次
*/
while (count < 10) {
// 自增计算
sum += DataRecoder.DATA[index];
System.out.println("线程" + Thread.currentThread().getId()
+ "\t参与计算的数为" + DataRecoder.DATA[index]
+ "\t第" + (count++) + "次计算的结果是:" + sum);
// 休息一会
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("计算任务执行完毕:" + index);
// 通知记录 运行数量改变
DataRecoder.RUNTHREADNUM--;
}
}
2014年04月11日 09点04分 9
看明白了线程启动的时候加1,结束时减1,主线程中判断线子程数是否为0
2014年04月11日 09点04分
回复 我想AFK :悟性不错
2014年04月11日 13点04分
level 10
主线程怎么等子线程都结束了才结束?
觉得:
那 main 中必须 while(true){
}
//然后其它线程执行完任务想结束了,就调用中断方法.. 改变标记,通知main结束,main中有判断标记的方法。
2014年04月11日 10点04分 10
level 8
我想AFK 楼主
这个太高级
2014年04月11日 10点04分 11
level 12
[咦]用join来等待线程结束
public static void main(String[] args) throws Exception{
final int[] a = {1, 2, 3, 4, 5};
Thread[] threads = new Thread[a.length];
for (int i = 0; i < a.length; i++){
final int index = i;
threads[i] = new Thread(() ->
System.out.println("thread " + index + ": " + (a[index] + a[index]))
);
threads[i].start();
}
for (Thread t : threads){
t.join();
}
}
2014年04月11日 10点04分 12
不太了解join的用法
2014年04月11日 11点04分
join是将当前线程加入到其他线程中,等其他线程执行完了再执行当前线程
2014年04月11日 13点04分
join是将当前线程加入到其他线程中,等其他线程执行完了再执行当前线程
2014年04月11日 13点04分
join是将当前线程加入到其他线程中,等其他线程执行完了再执行当前线程
2014年04月11日 13点04分
level 9
等我做完servlet
2014年04月11日 16点04分 13
level 13
[滑稽]
--------------------------魔兽老了还是我们都已长大了。。。如今我们这样子各奔前程的拼搏着,那段燃烧的岁月是否还记得?
2014年04月12日 02点04分 14
1