理论知识部分:

1.程序与进程:

程序是一段静态的代码,它是应用程序执行的蓝本。

进程是程序的一次动态执行,它对应了从代码加载、执行至执行完毕的一个完整过程。

2.多线程

多线程是进程执行过程中产生的多条执行线索。

3.进程:

线程是比进程执行更小的单位。线程不能独立存在,必须存在于进程中,同一进程的各线程间共享进程空间的数据。每个线程有它自身的产生、存在和消亡的过程, 是一个动态的概念。线程创建、销毁和切换的负荷远小于进程,又称 为轻量级进程(lightweight process)。

4.Java实现多线程:

-创建Thread类的子类

-在程序中定义实现Runnable接口的类

5.用Thread类的子类创建线程:

首先需从Thread类派生出一个子类,在该子类中 重写run()方法。

class hand extends Thread { public void run() {……} }

然后用创建该子类的对象

Lefthand left=new Lefthand();

Righthand right=new Righthand();

最后用start()方法启动线程

left.start();

right.start();

6.用Runnable()接口实现线程

首先设计一个实现Runnable接口的类;

然后在类中根据需要重写run方法;

再创建该类对象,以此对象为参数建立Thread 类的对象;

调用Thread类对象的start方法启动线程,将 CPU执行权转交到run方法。

7.线程的终止

调用interrupt()方法;

8.

8、测试线程是否被中断的方法

Java提供了几个用于测试线程是否被中断的方法。

-static boolean interrupted()

– 检测当前线程是否已被中断 ,并重置状态 “interrupted”值为false。

-boolean isInterrupted()

– 检测当前线程是否已被中断 ,不改变状态 “interrupted”值 。

9、线程的状态

-利用各线程的状态变换,可以控制各个线程轮流使用CPU,体现多线程的并行性特征。

-线程有如下7种状态:

New (新建)

Runnable (可运行)

Running(运行)

Blocked (被阻塞)

Waiting (等待)

Timed waiting (计时等待)

Terminated (被终止)

10、新创建线程

-new(新建)

线程对象刚刚创建,还没有启动,此时线程还处于不可运行状态。例如: Thread thread=new Thread(r); 此时线程thread处于新建状态,有了相应的内存空间以及其它资源。

11、可运行线程

- runnable(可运行状态)

此时线程已经启动,处于线程的run()方法之中。

此时的线程可能运行,也可能不运行,只要 CPU一空闲,马上就会运行。

调用线程的start()方法可使线程处于“可运行”状态。例如: thread.start();

12、被阻塞线程和等待线程

- blocked (被阻塞)

一个正在执行的线程因特殊原因,被暂停执行, 进入阻塞状态。

阻塞时线程不能进入队列排队,必须等到引起阻塞的原因消除,才可重新进入排队队列。

引起阻塞的原因很多,不同原因要用不同的方法解除。

-sleep(),wait()是两个常用引起线程阻塞的方法。

13、线程阻塞的三种情况

- 等待阻塞 -- 通过调用线程的wait()方法,让线程等待某工作的完成。

- 同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。

-其他阻塞 -- 通过调用线程的sleep()或join() 或发出了I/O请求时,线程会进入到阻塞状态。当 sleep()状态超时、join()等待线程终止或者超 时、或者I/O处理完毕时,线程重新转入就绪状态。

14、被终止的线程

Terminated (被终止) 线程被终止的原因有二:

一是run()方法中最后一个语句执行完毕而自然死亡。

二是因为一个没有捕获的异常终止了run方法而意外死亡。

可以调用线程的 stop 方 法 杀 死 一 个 线 程(thread.stop();),但是,stop方法已过时, 不要在自己的代码中调用它。

15、多线程调度

-Java 的线程调度采用优先级策略:

优先级高的先执行,优先级低的后执行;

多线程系统会自动为每个线程分配一个优先级,缺省时,继承其父类的优先级;

任务紧急的线程,其优先级较高;

同优先级的线程按“先进先出”的队列原则;

实验部分:

实验1:

测试程序1:

package synch;/*** 这个程序展示了多线程如何安全地访问数据结构。* @version 1.31 2015-06-21* @author Cay Horstmann*/
public class SynchBankTest
{public static final int NACCOUNTS = 100;public static final double INITIAL_BALANCE = 1000;public static final double MAX_AMOUNT = 1000;public static final int DELAY = 10;public static void main(String[] args){Bank bank = new Bank(NACCOUNTS, INITIAL_BALANCE);for (int i = 0; i < NACCOUNTS; i++){int fromAccount = i;Runnable r = () -> {try{while (true){int toAccount = (int) (bank.size() * Math.random());double amount = MAX_AMOUNT * Math.random();bank.transfer(fromAccount, toAccount, amount);Thread.sleep((int) (DELAY * Math.random()));}}catch (InterruptedException e){}            };Thread t = new Thread(r);t.start();}}
}

  

package synch;import java.util.*;
import java.util.concurrent.locks.*;/*** 具有许多银行帐户的银行,使用锁序列化访问。* @version 1.30 2004-08-01* @author Cay Horstmann*/
public class Bank
{private final double[] accounts;private Lock bankLock;//锁对象private Condition sufficientFunds;/*** 构建银行。* @param n账户数量* @param 每个帐户的初始余额*/public Bank(int n, double initialBalance){accounts = new double[n];Arrays.fill(accounts, initialBalance);bankLock = new ReentrantLock();sufficientFunds = bankLock.newCondition();}/*** 把钱从一个账户转到另一个账户,再从一个账户转到另一个账户,再从另一个账户转到另一个账户* @param from the account to transfer from* @param to the account to transfer to* @param amount the amount to transfer*/public void transfer(int from, int to, double amount) throws InterruptedException{bankLock.lock();try{//锁对象的引用条件对象while (accounts[from] < amount)sufficientFunds.await();System.out.print(Thread.currentThread());//打印出线程号accounts[from] -= amount;System.out.printf(" %10.2f from %d to %d", amount, from, to);accounts[to] += amount;System.out.printf(" Total Balance: %10.2f%n", getTotalBalance());sufficientFunds.signalAll();}finally{bankLock.unlock();}}/*** 获取所有帐户余额的总和。* @return 总平衡*/public double getTotalBalance(){bankLock.lock();//加锁try{double sum = 0;for (double a : accounts)sum += a;return sum;}finally{bankLock.unlock();//解锁}}/*** 获取银行中的帐户数量。* @return 账户数量*/public int size(){return accounts.length;}
}

  

package synch2;import java.util.*;/*** A bank with a number of bank accounts that uses synchronization primitives.* @version 1.30 2004-08-01* @author Cay Horstmann*/
public class Bank
{private final double[] accounts;/*** Constructs the bank.* @param n the number of accounts* @param initialBalance the initial balance for each account*/public Bank(int n, double initialBalance){accounts = new double[n];Arrays.fill(accounts, initialBalance);}/*** Transfers money from one account to another.* @param from the account to transfer from* @param to the account to transfer to* @param amount the amount to transfer*/public synchronized void transfer(int from, int to, double amount) throws InterruptedException{while (accounts[from] < amount)wait();System.out.print(Thread.currentThread());accounts[from] -= amount;System.out.printf(" %10.2f from %d to %d", amount, from, to);accounts[to] += amount;System.out.printf(" Total Balance: %10.2f%n", getTotalBalance());notifyAll();}/*** Gets the sum of all account balances.* @return the total balance*/public synchronized double getTotalBalance(){double sum = 0;for (double a : accounts)sum += a;return sum;}/*** Gets the number of accounts in the bank.* @return the number of accounts*/public int size(){return accounts.length;}
}

  

package synch2;/*** This program shows how multiple threads can safely access a data structure,* using synchronized methods.* @version 1.31 2015-06-21* @author Cay Horstmann*/
public class SynchBankTest2
{public static final int NACCOUNTS = 100;public static final double INITIAL_BALANCE = 1000;public static final double MAX_AMOUNT = 1000;public static final int DELAY = 10;public static void main(String[] args){Bank bank = new Bank(NACCOUNTS, INITIAL_BALANCE);for (int i = 0; i < NACCOUNTS; i++){int fromAccount = i;Runnable r = () -> {try{while (true){int toAccount = (int) (bank.size() * Math.random());double amount = MAX_AMOUNT * Math.random();bank.transfer(fromAccount, toAccount, amount);Thread.sleep((int) (DELAY * Math.random()));}}catch (InterruptedException e){}};Thread t = new Thread(r);t.start();}}
}

测试程序3:

class Cbank
{private static int s=2000;public   static void sub(int m){int temp=s;temp=temp-m;try {Thread.sleep((int)(1000*Math.random()));}catch (InterruptedException e)  {              }s=temp;System.out.println("s="+s);}}class Customer extends Thread
{public void run(){for( int i=1; i<=4; i++)Cbank.sub(100);}}
public class Thread3
{public static void main(String args[]){Customer customer1 = new Customer();Customer customer2 = new Customer();customer1.start();customer2.start();}
}

  

修改代码

package lll;class Cbank
{private static int s=2000;public synchronized  static void sub(int m){int temp=s;temp=temp-m;try {Thread.sleep((int)(1000*Math.random()));}catch (InterruptedException e)  {              }s=temp;System.out.println("s="+s);}}class Customer extends Thread
{public void run(){for( int i=1; i<=4; i++)Cbank.sub(100);}}
public class Thread3
{public static void main(String args[]){Customer customer1 = new Customer();Customer customer2 = new Customer();customer1.start();customer2.start();}
}

实验2 编程练习

package lll;public class Demo {public static void main(String[] args) {Runnable runnable = new MyThread();new Thread(runnable).start();new Thread(runnable).start();new Thread(runnable).start();}public static class MyThread implements Runnable{ private int tickets=10; public void run() { while(tickets>0){ System.out.println(Thread.currentThread().getName() + "窗口售:第" + tickets-- + "张票"); } } }
}

实验总结:

本周我们继续学习了同步线程的相关知识,了解了并发多线程的两种解决方法,一种是锁对象,还有一种是synchronized关键字。还有wait()、notify 和notifyAll()方法。

这学期Java我们已经学到了最后一章,在这将近一个学期的学习中感谢有老师悉心的传授我知识,还有告诉了我们很多的不论是Java学习还是其他方面的道理。还有学长每次不厌其烦的为我们演示代码,给我们分享自己的经验,牺牲了很多自己的时间。

在以后的学习力我会继续完善在这门语言学习中我的不足,也会铭记老师的教诲,不会学完之后就忘记,而是学会使用这门语言解决以后学习中的问题。

在这里对老师和学长再次表示真挚的感谢。

转载于:https://www.cnblogs.com/Weiron/p/10163823.html

孔维滢 20171010110《面向对象程序设计(java)》第十七周学习总结相关推荐

  1. 201771010110孔维滢《面向对象程序设计Java》第十六周实验总结

    理论知识部分: 1.程序与进程: 程序是一段静态的代码,它是应用程序执行的蓝本. 进程是程序的一次动态执行,它对应了从代码加载.执行至执行完毕的一个完整过程. 2.多线程 多线程是进程执行过程中产生的 ...

  2. 孔维滢《面向对象程序设计(java)》课程学习总结

    实验十八  总复习 1.实验目的与要求               (1) 综合掌握java基本程序结构: (2) 综合掌握java面向对象程序设计特点: (3) 综合掌握java GUI 程序设计结 ...

  3. 201771010131孔维滢《面向对象程序设计(java)》第六周学习总结

    理论知识学习部分 类继承的格式: class  新类名  extends  已有类名(子类比超类拥有的功能更加丰富.) 继承层次:Java不支持多继承. 多态性:Java中,对象变量是多态的:不能把对 ...

  4. 201871010115——马北《面向对象程序设计JAVA》第二周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  5. 《数据结构与面向对象程序设计》第1周学习总结

    20182316胡泊 2019-2020-1 <数据结构与面向对象程序设计>第1周学习总结 教材学习内容总结 简单java程序是有哪些部分组成的 Java程序好的排版布局是怎样的 程序开发 ...

  6. 201671010117 2016-2017-2 《Java程序设计》Java第十七周学习心得

    Java第十七周学习心得 这一周老师对线程的内容进行了详细讲解,包括线程创建的两种技术,和线程的优先级属性及调度方法,对于布置的实验作业中,实验九中存在一点问题,程序运行不出来,后来跟同学商量探讨没有 ...

  7. 孔维滢 20171010110《面向对象程序设计(java)》第十周学习总结

    理论知识: 1.泛型类的定义,一个泛型类就是具有一个或多 个类型变量的类,即创建用类型作为参数的类. 如: class Generics<K,V>: 2.泛型方法,除了泛型类外,还可以只单 ...

  8. 四十八.面向对象程序设计——Java语言第一周编程题:分数

    题目内容: 设计一个表示分数的类Fraction.这个类用两个int类型的变量分别表示分子和分母. 这个类的构造函数是: Fraction(int a, int b) 构造一个a/b的分数. 这个类要 ...

  9. 201771010118马昕璐《面向对象程序设计java》第八周学习总结

    第一部分:理论知识学习部分 1.接口 在Java程序设计语言中,接口不是类,而是对类的一组需求描述,由常量和一组抽象方法组成.Java为了克服单继承的缺点,Java使用了接口,一个类可以实现一个或多个 ...

最新文章

  1. 测量左右磁极的原片磁铁
  2. node爬取app数据_node爬取拉勾网数据并导出为excel文件
  3. STM32F1和STM32F4 区别 (安富莱整理)
  4. C# mvc 500 内部服务器访问异常
  5. Spring思维导图,让spring不再难懂(一)
  6. Java, C#, Swift语法对比速查表
  7. flume 一对多hdfs_10PB 规模的 HDFS 数据在 eBay 的迁移实战
  8. 他的产品成华强北山寨模板,仅次华为苹果,这个赛道杀入年轻黑马!
  9. 3.1.1 Spring 简介
  10. 字节回应阿里涉侵犯男员工曾面试并通过一面;HarmonyOS 2.0用户数升至5000万|极客头条...
  11. 关于前端样式定位的一些自己的看法
  12. tomcat实现多端口、多域名访问(只针对一个tomcat)
  13. DenseNet训练CIFAR10数据集的pytorch实现
  14. docker搭建sftp服务器
  15. 从高考落榜生到网络专家
  16. 中国石油大学-《现代应用文写作》第一阶段在线作业
  17. PIL库改变图片大小
  18. docker redis
  19. A. Arithmetic Array
  20. 2020年保育员(中级)多少分及格及保育员(中级)模拟考试系统

热门文章

  1. Pygame实战:升级后的2048小游戏—解锁新花样 根本停不下来
  2. 怎么用Python获取全网最全的杰尼龟表情包
  3. Facebook田渊栋谈人生挑战与选择
  4. 北大校友的算法被玩出新高度,AI自动化在线抠图
  5. java未发现数据源名称并且未指定默认驱动程序_转:java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序...
  6. 深度学习实战 | 使用Kera预测人物年龄
  7. 主体功能区规划的定位
  8. 遥感图像数据类型的区别
  9. mysql中outer join用什么,mysql – “INNER JOIN”和“OUTER JOIN”有什么区别?
  10. MySQL利用磁盘缓存写入_MySQL写入缓冲区在数据库中的作用( Change Buffer )