zoukankan      html  css  js  c++  java
  • 第六周学习总结

    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
查看全文
  • 相关阅读:
    LeetCode 81 Search in Rotated Sorted Array II(循环有序数组中的查找问题)
    LeetCode 80 Remove Duplicates from Sorted Array II(移除数组中出现两次以上的元素)
    LeetCode 79 Word Search(单词查找)
    LeetCode 78 Subsets (所有子集)
    LeetCode 77 Combinations(排列组合)
    LeetCode 50 Pow(x, n) (实现幂运算)
    LeetCode 49 Group Anagrams(字符串分组)
    LeetCode 48 Rotate Image(2D图像旋转问题)
    LeetCode 47 Permutations II(全排列)
    LeetCode 46 Permutations(全排列问题)
  • 原文地址:https://www.cnblogs.com/crystallin/p/5375689.html
  • Copyright © 2011-2022 走看看