头歌 JAVA 实验七——线程

前言:

历时十二日,博客再更新,博主深感愧疚,由于近日沉迷于原神,且临近期末,日后更新可能会更慢,直至考试结束。望看官们海涵。

第1关:创建三个线程,并进行同步调

任务描述

本关任务: 创建三个线程Thread1、Thread2及Thread3。三个线程要进行同步调度。

要求:

不管各线程的优先级及各线程sleep的时间,Thread1首先运行,获取数据后将数据存储在数据对象中,Thread2从数据对象中取值加10后存回数据对象,并输出;Thread3从数据对象中取值加10后输出。这三个线程运行必须同步,运行时序如下:

img

实验已经定义了一个类Gatherinfo(如下),该类的GetVal()方法完成数据的生成。

class Gatherinfo{    public int GetVal() {        int n = (int)(Math.random()*20+10);        return n;    }}

线程Thread1类继承类Gatherinfo,在Thread1类中直接调用Gatherinfo类中GetVal()方法获取采集的数据。 类dataObj完成各线程的数据交换。有两个方法: void put(int n);将数据存入数据对象中。 int get();返回数据对象中的数据。 `` Gatherinfo类系统已完成,不需要大家编此类的程序。 每个线程循环运行10次以上,各线程的输出格式如下: 10 20 30 16 26 36 每个数字代表一个线程的输出。 按要求完成Thread1、Thread2、Thread3类的编写。

最后设计一个类来测试你的所有的程序。


开始你的任务吧,祝你成功!

原理:

  • 首先我们得知道什么是线程,在我的理解中,一个程序就是一个进程,我们玩的原神游戏是个进程,自己写的程序也算是一个进程,只是小一点而已。而线程就是进程的一部分,一个进程可能要干很多事,比如原神,我们通过cpu将数据解析是个线程,通过cpu调取内存也是个线程。cpu在任何时候都只能跑一个线程,但由于线程之间的调度,和cpu运行速度非常快,所以在我们看来几个线程是可以同步运行的。

  • 对于这道题,我们需要知道几个线程调度的方法,如wait()和notify()。

    • wait()是停止当前线程。
    • notify()是唤醒当前所有在等待的线程中的优先级最高的且等待时间最久的那个。
  • 这道题还有一个思路就是:各个线程对数据对象的读写操作都是通过调用数据对象的方法来实现,这样对于同一数据对象的线程调度比较方便。

  • 这题还有一个要注意的地方,Thread1由于题目要求要继承一个类,所以它是通过runnable接口实现接口,而Thread2和Thread3只需要继承个Thread类就行了。

源码:

dataObj类

package step1;
//在此写dataObj类
public class dataObj{
    public int vul;
    public int state=1;
    public void put(int n){
        vul=n;
    }
    public int get(){
        return vul;
    }
    public synchronized void func1(int n) {
        if(state!=1) {
            try{
                wait();
            }catch(Exception r) {
                
            }
        }
        vul=n;
        System.out.print(vul+" ");
        state=2;
        notify();
    }
    public synchronized void func2() {
        if(state!=2) {
            try{
                wait();
            }catch(Exception r) {
                
            }
        }
        vul+=10;
        System.out.print(vul+" ");
        state=3;
        notify();
    }
    public synchronized void func3() {
        if(state!=3) {
            try{
                wait();
            }catch(Exception r) {
                
            }
        }
        System.out.print((vul+10)+" ");
        System.out.println();
        state=1;
        notify();
    }
}

Thread1类

package step1;
//在此写Thread1类
public class Thread1 extends Gatherinfo implements Runnable {
    public dataObj d;
    public Thread1(dataObj d) {
        this.d=d;
    }
    @Override
    public void run() {
        // TODO 自动生成的方法存根
        for(int i=0;i<10;i++) {
            int t=GetVal();
            d.func1(t);    
        }
    }
}

Thread2类

package step1;
//在此写Thread2类     
public class Thread2 extends Thread {
    dataObj d;
    public Thread2(dataObj d) {
        this.d=d;
    }
    @Override
    public void run() {
        // TODO 自动生成的方法存根    
        for(int i=0;i<10;i++) {
            d.func2();
        }        
    }
}

Thread3类

package step1;
//在此写Thread3类
public class Thread3 extends Thread  {
    dataObj d;
    public Thread3(dataObj d) {
        this.d=d;
    }
    @Override
    public void run() {
        // TODO 自动生成的方法存根        
        for(int i=0;i<10;i++) {
            d.func3();
        }        
    }
}
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2022 舒窈
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信