作者:辣手夏兰荇德_云 | 来源:互联网 | 2024-09-28 13:37
java基础教材中多线程一章我觉得难的一个问题。首先要用多线程实现。因此要有类继承Thread或者实现Runable。由于每个线程的操作数不一样我生成了十个不同对象的线程。publ
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() 了