1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容。

本次PTA作业题集多线程
BounceThreadBallRunnable类有什么用?为什么代码中需要调用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 | 
原文:http://www.cnblogs.com/yellower/p/7953917.html