第六周学习总结

20145113第六周学习总结

教材学习内容总结

线程

1.main外独立设计流程

  • 撰写操作java.lang.Runnable接口,线程进入点是操作在run()方法中
  • 继承Thread,重新定义run()方法
public class Stage extends Thread{}
public class Halou implements Runnable{}

操作Runnable接口,还可以继承其他类,故比较有弹性。

2.让目前线程暂停指定时间

  • 使用java.lang.Thread的静态sleep()方法,单位毫秒,但需要处理InterruptedException
  •  try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    

    Thread用getName()来获得线程的名称

     System.out.println(getName()+"是一个timid boy!");
    

    用setName()来给线程命名

    Actor actor=new Actor();
        actor.setName("baby");
        actor.start();
    

    Runnable接口:使用Thread.currentThread().getName()来获得线程名称。

    System.out.println(Thread.currentThread().getName()+":我不无聊\n");
    

    使用

    Thread actress=new Thread(new Actress(),"crystal");
    

     Actor cr=new Actor();
     Thread crystal=new Thread(cr,"crystal");
    

    3.线程的工作机制
    一个核在一个时间只能执行一条线程,只有在执行的线程处于休眠的状态才能去执行其它线程。 例如Actor线程,他的每条循环语句都执行一次休眠,所以在休眠的期间Actress线程开始工作

    for(int i=1;i<3;i++)
            {
                System.out.println("我好无聊,好无聊!");
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
            }
    

    5.正确让线程停止
    Thread上虽然有定义stop()方法,但是由于会引发某些问题(程序戛然而止),被标记为Deprecated 如果想要让线程停止需要我们手动操作,可以采用设置旗标的方式退出线程。例如我可以在线程中设置keeprunning,然后再要停止的时候哦将keeprunning=false。
    使用interrupt也不是正确让线程退出的方法,

    6.线程具有优先权,可使用Thread的setPriority()方法来设置。设定值1~10;

    7.安插线程
    使用join()

     for(int i=0;i<3;i++)
        {
            System.out.println(getName()+":开始写博客了\n");
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    

    虽然也在每次循环都让线程休眠但是由于调用了join()方法,该线程的执行都没有被打扰。

    try {
            teacher.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    

    代码调试过程中的问题和解决过程

    1.关于interrupt()与线程终止

    public class Interrupt extends Thread {
    
    public static void main(String[] args) {
        System.out.println("线程要开始了");
        Interrupt interrupt=new Interrupt();
        interrupt.start();
        try {
            Thread.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        interrupt.interrupt();    //中断
        try {
            Thread.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("线程要结束了");
    
    }
    public void run()
    {
        while(true)
        {
            System.out.println("线程在执行");
        }
    }
    }
    

    虽然使用了interrupt()进行中断,但会发现程序并没有像想象中那样中断。后来尝试对while语句进行修改

    public void run()
    {
        while(!this.isInterrupted())
        {
            System.out.println("线程在执行");
        }
    }
    

    程序在该中断的地方中断了,看到书上说interrupt()会由于线程进入Blocked状态,再调用interrupt()则会抛出异常。于是进行尝试

     while(!this.isInterrupted())
        {
            System.out.println("线程在执行");
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    

    2.关于能量为什么不守恒

    在进行编写能量在转换的过程保持能量守恒

        public  void transfer(int from,int to,double amount)
    {
        if(energyBoxs[from]<amount)
            return;
        energyBoxs[from]=energyBoxs[from]-amount;
        System.out.printf("%s 从%d转移%7.2f单位能量到%d\n",Thread.currentThread().getName(), from, amount, to);
        energyBoxs[to]=energyBoxs[to]+amount;
        System.out.printf("能量总和:%10.2f\n", getTotalEnergy());
    }
    

    本应该在每次能量转换后都进行能量总数的输出,但是为什么与想像的不一样!!!!!

    3.

    发现了想要在第一部分执行的actor由于每个循环都有一次休眠,导致其它部分的线程执行完了才轮到后几次循环。于是尝试用书上说的设置线程的优先级。但是测试结果依然没有达到要求,询问的其它人以后得知,设置线程的优先级只会在分配的时候增加机率,需找解决方法中。

    实验思考与总结

    看到线程这章,最大的感受就是需要静下心来,认真分析,不然一不小心就陷入死胡同了,多条线程都在执行。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000 25 100
    第一周 100/200 1/2 3/5
    第二周 300/400 1/3 4/9 使用everything与PowerCmd
    第三周 200/600 1/3 8/17 安装了idea,并将代码上传到gitosc上
    第四周 400/1000 1/4 15/32
    第五周 800/1800 2/6 20/52
    原文地址:https://www.cnblogs.com/crystallin/p/5375689.html