java 多线程。 编写10个线程,第一个线程从1加到10,第二个线程第11加到20,。。。第10个线程从91加到100.最够把10个线程结果相加

java 基础教材中多线程一章 我觉得 难 的一个问题。
首先 要用多线程实现 。 因此要有类继承 Thread 或者 实现 Runable。

由于 每个线程 的 操作数 不一样 我生成了十个不同对象的线程。

public class HomeWork6_4_1 {
	
	public static void main(String[] args) throws InterruptedException {
		for(int i=0; i<10; i++) {
			Add add = new Add(i*10+1, i*10+10);
			add.start();
		}
		Thread.sleep(100);	// 休眠 一会 以便 其他线程执行完 不然 主线程执行到输出语句时 其他线程可能还未执行完毕
		System.out.println(Add.sub);
	}

}

class Add extends Thread{
	
	static Object object = new Object();	// 同步代码块锁
	
	static int sub;							// 类属性 用于保存线程相加结果
	
	private int min;		// 传过来数据的 最小值 
	private int max;		// 最大值
	

	public Add(int min, int max) {
		this.min = min;		// 对象属性赋值
		this.max = max;		// 对象属性赋值
	}

	public void run() {
		int res = 0;
		for(int i=min; i<=max; i++) {
			res += i;	// 执行 从 min 加到 max
		}
		
//		同步代码块 同一时刻只有一个 线程可以 调用该代码块内内容
		synchronized (object) {
			System.out.println(Thread.currentThread().getName() + "正在将结果附上" + res);
			sub += res;
		}
	}
	
}

当然 使用 Thread.sleep(100)这样的方式 只是让main线程 休眠一会 并不能真正保证 其他线程 执行 完毕 可以 使用 .join()插队

public class HomeWork6_4_1 {
	
	public static void main(String[] args) throws InterruptedException {
		for(int i=0; i<10; i++) {
			Add add = new Add(i*10+1, i*10+10);
			add.start();
			add.join();
			
		}
		System.out.println(Add.sub);
	}

}

class Add extends Thread{
	
	static int sub;							// 类属性 用于保存线程相加结果
	
	private int min;		// 传过来数据的 最小值 
	private int max;		// 最大值
	
//	注 如果设置 同步方法的 话  一定 要 设置成静态方法  因为 生成了十个 不同的 对象 使用对象方法的话 锁是该对象 每个都 不一样的 也就没用了
//	静态方法的 锁是 该类 
	synchronized static void addres(int num) {
		System.out.println(Thread.currentThread().getName() + "正在将结果附上" + num);
		sub += num;
	}
	

	public Add(int min, int max) {
		this.min = min;		// 对象属性赋值
		this.max = max;		// 对象属性赋值
	}

	public void run() {
		int res = 0;
		for(int i=min; i<=max; i++) {
			res += i;	// 执行 从 min 加到 max
		}
		
		addres(res);	// 调用同步方法
		
	}
	
}

每个线程 都插队 也就是 所有其他线程执行完 main 线程 才能够执行
该作业考量 的 也许有 线程执行顺序 。。。 即可以通过设置线程的优先级 main的优先级是 5 大概 可以将 生成的对象线程优先级 设置成 10 这样根据系统不同不一定有效

通用方法 就是 .join() 了

你可能感兴趣的:(多线程,Java)