20145113第六周学习总结
教材学习内容总结
线程
1.main外独立设计流程
- 撰写操作java.lang.Runnable接口,线程进入点是操作在run()方法中
- 继承Thread,重新定义run()方法
public class Stage extends Thread{}
public class Halou implements Runnable{}
操作Runnable接口,还可以继承其他类,故比较有弹性。
2.让目前线程暂停指定时间
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 |