[关闭]
@Senl 2017-03-30T12:40:59.000000Z 字数 4519 阅读 1111

3.30学习进度

技术学习


Java

HF Java

进程 Thread

测试示例

  1. //实现Runnable接口来建立给thread运行的任务
  2. public class MyRunnable implements Runnable {
  3. @Override
  4. public void run() {
  5. //Runnable是抽象类,所以一定要实现其中所有的方法
  6. //没有参数,要运行的程序代码放在这里
  7. doIt();
  8. }
  9. public void doIt() {
  10. System.out.println("you r in a thread");
  11. }
  12. }

  1. //线程测试启动器
  2. public class ThreadTestDrive {
  3. public static void main(String[] args) {
  4. Runnable threadJob = new MyRunnable();
  5. Thread myTread = new Thread(threadJob);
  6. myTread.start();
  7. System.out.println("now you r in main");
  8. }
  9. }

输出结果(可能是):

  1. now you r in main
  2. you r in a thread

线程thread的一些基本概念

 1. 以小写t描述的thread是一个独立的线程
 2. Java中每一个线程都有独立的执行空间
 3. 大写Thread是java。lang。Thread这个类,它的对象用于表示线程
 4. Thread需要任务,通过Runnable的实例
 5. 需要将Runnable传给Thread的构造函数才能启动新的线程 
 6. Java虚拟机的调度器不能保证人和线程的执行时间和顺序,所以期待它会完全地保证平均分配执行。

对使用线程的一些小改进---使用sleep()

改进后的测试示例

  1. //(改进后的)实现Runnable接口来建立给thread运行的任务
  2. public class MyRunnable implements Runnable {
  3. @Override
  4. public void run() {
  5. //Runnable是抽象类,所以一定要实现其中所有的方法
  6. //没有参数,要运行的程序代码放在这里
  7. /*
  8. * 改进的代码
  9. */
  10. try{
  11. Thread.sleep(2000); //强迫进程离开执行中的状态
  12. }catch(InterruptedException ex) {
  13. ex.printStackTrace();
  14. }
  15. /*
  16. * 以下为执行代码
  17. */
  18. doIt();
  19. }
  20. public void doIt() {
  21. System.out.println("you r in a thread");
  22. }
  23. }

  1. //线程测试启动器
  2. public class ThreadTestDrive {
  3. public static void main(String[] args) {
  4. Runnable threadJob = new MyRunnable();
  5. Thread myTread = new Thread(threadJob);
  6. myTread.start();
  7. System.out.println("now you r in main");
  8. }
  9. }

输出结果(一定是):

  1. now you r in main
  2. you r in a thread

建立和启动两个线程示例

  1. //测试 启动和建立两个线程
  2. public class ThreadTestDrive implements Runnable {
  3. public static void main(String[] args) {
  4. //创建出ThreaTestDrive实例
  5. ThreadTestDrive runner = new ThreadTestDrive();
  6. //创建出两个Thread实例
  7. Thread alpha = new Thread(runner);
  8. Thread beta = new Thread(runner);
  9. //分别对两个线程进行名字修改
  10. alpha.setName("Thread Alpha");
  11. beta.setName("Thread Beta");
  12. //启动两个线程
  13. alpha.start();
  14. beta.start();
  15. }
  16. @Override
  17. public void run() {
  18. for (int i = 0; i < 5; i ++) {
  19. //每一个线程运行个五次,显示出当前运行的是哪一个线程
  20. String threadName = Thread.currentThread().getName();
  21. System.out.println(threadName + "正在执行");
  22. }
  23. }
  24. }

测试结果:

  1. Thread Alpha正在执行
  2. Thread Beta正在执行
  3. Thread Beta正在执行
  4. Thread Beta正在执行
  5. Thread Beta正在执行
  6. Thread Beta正在执行
  7. Thread Alpha正在执行
  8. Thread Alpha正在执行
  9. Thread Alpha正在执行
  10. Thread Alpha正在执行

线程的并发性问题

  1. //两人的银行账号类
  2. public class BankAccount {
  3. private int balance = 3000; //将存款数设为私有,以保护
  4. public int getBalance() { //声明一个公共的方法让两人查询账户存款
  5. return balance;
  6. }
  7. public void withdraw (int amount){ //取出存款的方法
  8. balance = balance - amount;
  9. }
  10. }

  1. //创建两个线程并对银行账户进行取款或者查看的任务
  2. public class MoneyRunnable implements Runnable {
  3. private BankAccount account = new BankAccount();
  4. public static void main(String[] args) {
  5. //将MoneyRunnable实例化
  6. MoneyRunnable job = new MoneyRunnable();
  7. //创建两个线程并对它们分别命名后启动
  8. Thread boy = new Thread(job);
  9. Thread girl = new Thread(job);
  10. boy.setName("BoyFriend");
  11. girl.setName("GirlFriend");
  12. boy.start();
  13. girl.start();
  14. }
  15. //重写Runnable下的run()方法
  16. @Override
  17. public void run() {
  18. for(int x = 0;x <10; x++) {
  19. makeWithdrawal(300); //一次取款300
  20. if(account.getBalance() < 0) {
  21. System.out.println("超出预支了!");
  22. }
  23. }
  24. }
  25. //定义一个取款的方法让两人取款
  26. private void makeWithdrawal(int amount) {
  27. if(account.getBalance() >= amount) {
  28. System.out.println(Thread.currentThread().getName()+ "准备取款");
  29. try{
  30. System.out.println(Thread.currentThread().getName() + "准备进入不执行状态");
  31. Thread.sleep(500); //让boy线程睡眠
  32. } catch(InterruptedException ex) {
  33. ex.printStackTrace();
  34. }
  35. System.out.println(Thread.currentThread().getName() + "进入活动状态");
  36. account.withdraw(amount);
  37. System.out.println(Thread.currentThread().getName() + "完成取款");
  38. }
  39. else {
  40. System.out.println("对不起," + Thread.currentThread().getName() + ",没钱了,取不到钱");
  41. }
  42. }
  43. }

输出结果:

  1. GirlFriend准备取款
  2. BoyFriend准备取款
  3. GirlFriend准备进入不执行状态
  4. BoyFriend准备进入不执行状态
  5. BoyFriend进入活动状态
  6. BoyFriend完成取款
  7. BoyFriend准备取款
  8. BoyFriend准备进入不执行状态
  9. GirlFriend进入活动状态
  10. GirlFriend完成取款
  11. GirlFriend准备取款
  12. GirlFriend准备进入不执行状态
  13. BoyFriend进入活动状态
  14. BoyFriend完成取款
  15. BoyFriend准备取款
  16. BoyFriend准备进入不执行状态
  17. GirlFriend进入活动状态
  18. GirlFriend完成取款
  19. GirlFriend准备取款
  20. GirlFriend准备进入不执行状态
  21. GirlFriend进入活动状态
  22. GirlFriend完成取款
  23. 对不起,GirlFriend,没钱了,取不到钱
  24. BoyFriend进入活动状态
  25. BoyFriend完成取款
  26. 超出预支了!
  27. 对不起,BoyFriend,没钱了,取不到钱
  28. 超出预支了!
  29. 对不起,BoyFriend,没钱了,取不到钱
  30. 超出预支了!
  31. 对不起,GirlFriend,没钱了,取不到钱
  32. 超出预支了!

修改后,运行结果中不会出现“超出预支”这个情况了.

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注