标签:blog not 指定 boolean his 绘制 为什么 list 代码块
1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容。
本次PTA作业题集多线程
BounceThread
BallRunnable
类有什么用?为什么代码中需要调用Thread.sleep
进行休眠?答:BallRunnable类是支持多线程的类,开启了一个程序,使小球按照指定的规则移动,然后画出来获得小球的形状。代码中调用Thread.sleep
进行休眠是为了延缓线程完成的时间,这样我们才能看到小球的移动,不然太快了看不到小球的移动轨迹。
Ball.java
只做了两件事,这两件事分别是什么?答:move()
方法,实现小球的移动; getShape()
方法,获取小球的坐标和大小。
BallComponent
对象是干什么的?答:添加小球;画出小球。
答:用于存放添加的小球。
答:只有1个。
答:是。每按一次start
按钮,addBall
方法都会启动一个新线程。
Runnable
接口的实现类来实现多线程程序比通过继承自Thread
类实现多线程程序有何好处?答:Java中不支持多继承,只能继承一个父类,但可以继承多个接口,所以使用实现接口的方法可以避免继承的局限。使用Runnable实现多线程使多个线程一起完成多个任务。
System.out.println(Thread.currentThread().getName()+" "+isAlive())
打印标识信息。System.out.println(Arrays.toString(getClass().getInterfaces()));
打印。PrintTask
类实现Runnable
接口,功能主要是输出从0到n-1的整数(n在创建PrintTask
对象的时候初始化)。并在最后使用System.out.println(Thread.currentThread().getName());
输出标识信息。Thread t1 = new Thread(
() -> {
System.out.println(mainThreadName);
System.out.println(Thread.currentThread().getName());
System.out.println(Arrays.toString(Thread.class.getInterfaces()));
}
);
System.out.println(Thread.currentThread().getName() + " stop")
打印标识信息。TestUnSynchronizedThread.java
源代码使其可以同步访问。(关键代码截图,需出现学号)截图如下:
完成题集6-4(互斥访问)与6-5(同步访问)
synchronized
修饰方法实现互斥同步访问,还有什么办法可以使用synchronized
实现互斥同步访问,使用代码说明(请出现相关代码及学号)?可以使用synchronized
代码块:
public static void addId() {//黄子颖 201621123045
synchronized (Counter.class) {//代表Counter类型的对象
id++;
}
}
使用显式的Lock
和Condition
对象:
class Account {//黄子颖 201621123045
private int balance;
public Account(int balance) {
super();
this.balance = balance;
}
public int getBalance() {
return balance;
}
public void deposit(int money) {
lock.lock();
try {
balance += money;
condition.signalAll();
} finally {
// TODO: handle finally clause
lock.unlock();
}
}
public void withdraw(int money) {
lock.lock();
try {
while (balance < money) {
try {
condition.await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
balance -= money;
} finally {
// TODO: handle finally clause
lock.unlock();
}
}
private java.util.concurrent.locks.Lock lock = new java.util.concurrent.locks.ReentrantLock();
private java.util.concurrent.locks.Condition condition = lock.newCondition();
}
synchronized
修饰,实现加锁;而同步代码块在内部使用synchronized
代码块。synchronized
同步代码块或者同步方法时,线程的状态是怎么变化的?答:原理是当资源被一个任务使用时,其上加锁。现在在访问某项资源的任务必须锁定这种资源,这时其他任务无法访问它。其被解锁时,另一个任务可以锁定并且使用该资源了。例如:在下面的代码段中,可以获得对象“this”上的内部锁。当执行程序时,如果不能获得相对应的对象锁,那么将不能执行上述代码块中的内容,即synchronized同步代码块中的i++语句,就必须等待,等待获得对象锁。从而通过对象锁实现了互斥访问。
class MyCounter{
private int i = 0;
public void increment(){
//i++;
synchronized (this) {
i++;
}
}
……
}
线程的状态的变化为:如果没有获得对象锁就进入Look Pool状态,等待同步锁被释放;同步锁释放后,线程进入Runnable状态。
答:Java多线程中使用wait()
和notify()
/notifyAll()
方法来实现线程之间的通信,进而实现线程的协同工作的。
运行结果如下:
答:结果可能会不正常,剩余货物可能不为0,可能是其他的数量。因为生产者与消费者的存取速度不一致,可能出现了没有库存还在取货物的情况。
截图如下:
题目集:多线程
在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
必须出现几个要素:提交日期-用户名(姓名与学号)-不提交说明
需要有两张图(1. 排名图。2.PTA提交列表图)
需要将每周的代码统计情况融合到一张表中。
周次 | 行数 | 新增行数 | 文件数 | 新增文件数 |
---|---|---|---|---|
1 | 115 | 115 | 17 | 17 |
2 | 421 | 306 | 24 | 7 |
3 | 698 | 277 | 30 | 6 |
5 | 1085 | 387 | 38 | 8 |
6 | 1497 | 412 | 48 | 10 |
7 | 2033 | 536 | 57 | 9 |
8 | 2265 | 232 | 60 | 3 |
9 | 2728 | 522 | 65 | 5 |
10 | 3360 | 632 | 73 | 8 |
11 | 3958 | 598 | 83 | 10 |
12 | 4435 | 477 | 90 | 7 |
标签:blog not 指定 boolean his 绘制 为什么 list 代码块
原文地址:http://www.cnblogs.com/yellower/p/7953917.html