[关闭]
@zhangyy 2020-12-04T09:27:47.000000Z 字数 17387 阅读 158

Java的多线程

Java基础系列



一: Java的多线程

1.1 应用程序

  1. 进程:
  2. 1. 运行时(runtime)应用程序。
  3. 2. 进程之间的内存不是共享(独占)
  4. 3. 进程间的通讯使用的是socket (套接字)
  5. 多线程:
  6. 1. 进程内并发执行的代码段。
  7. 2. 线程之间共享内存。
  8. 3. 创建灵活响应的桌面程序
  9. 4. 每个运行着的线程对应一个stack
  10. 5. 应用程序至少有一个线程(主线程 main
  11. java.lang.Thread
  12. -----------------------
  13. 1. Thread.yield()方法
  14. 2. Thread.sleep()方法
  15. 让当前进程休眠所需要的毫秒数

1.2 创建线程的方式:

  1. 继承Thread 类:
  2. 1. 子类覆盖父类中的run 方法,的代码存放在run 中。
  3. 2. 建立子类对象的同时线程也被创建。
  4. 3. 通过调用start 方法开启线程。
  1. package com.learnjava.day08;
  2. public class ThreadDemo01 {
  3. public static void main(String[] args) {
  4. // TODO Auto-generated method stub
  5. MyThread m = new MyThread();
  6. m.start();
  7. YouThread y = new YouThread();
  8. y.start();
  9. }
  10. }
  11. // 线程 一:
  12. class MyThread extends Thread{
  13. public void run() {
  14. for(; ;) {
  15. System.out.println("hello world -1");
  16. }
  17. }
  18. }
  19. // 线程二:
  20. class YouThread extends Thread{
  21. public void run() {
  22. for(; ;) {
  23. System.out.println("hello world - 2");
  24. }
  25. }
  26. }

image_1bpfo2n9f1i7t1cj1jjl1v1rkk9.png-44kB


  1. java.lang.Thread
  2. ----
  3. 1. Thread.yield()方法
  4. 让当前线程让出cpu的抢占权,具有谦让的意思,瞬时动作。
  5. 2. Thread.sleep();
  6. 让当前线程休眠指定毫秒数。
  7. 释放cpu 的强占权 和锁旗标没有关系
  8. 3. Thread.join()
  9. 当前线程等待指定的线程结束后才能继续运行
  10. Thread t = ....
  11. t.join();
  12. 4.daemon
  13. 守护,服务员。
  14. 为其他线程提供服务器的线程。
  15. 若进程中剩余的线程都是守护线程的化,则进程终止了。
  16. Thread.setDaemon(true);
  17. 5. ---
  18. 原子性操作
  19. 6.线程间通讯,共享资源的问题
  20. 锁,防止并发访问,由并行改为串行。
  21. 参照物的锁旗标
  22. // 同步代码块:
  23. synchronized{
  24. .....
  25. }
  26. 同步代码块执行期间,线程始终持有对象的监控权,其他线程只能等待,处于阻塞状态。
  27. 7.同步方法是以当前所在对象做锁旗标
  28. synchronized(this) == 同步方法
  29. 8. 同步静态方法:使用类做为同步的标记
  30. public static synchronized xxx(){
  31. ......
  32. }

  1. package com.learnjava.day08;
  2. public class ThreadDemo02 {
  3. public static void main(String[] args) {
  4. MyThread m1 = new MyThread("Thread-1");
  5. MyThread m2 = new MyThread("Thread-2");
  6. m1.start();
  7. m2.start();
  8. }
  9. }
  10. class MyThread extends Thread{
  11. private String name ;
  12. public MyThread (String name) {
  13. this.name = name;
  14. }
  15. public void run() {
  16. for(;;) {
  17. System.out.println(name);
  18. //yield.放弃,谦让
  19. Thread.yield();
  20. }
  21. }
  22. }

image_1bpfraki51nc81chkjdo1pgmfa3m.png-56.3kB

  1. package com.learnjava.day08;
  2. public class ThreadDemo03 {
  3. public static void main(String[] args) throws Exception {
  4. // TODO Auto-generated method stub
  5. Player p1 = new Player("tom",3000);
  6. Player p2 = new Player("jack",2500);
  7. Player p3 = new Player("harry",2000);
  8. Player p4 = new Player("natty",1500);
  9. p1.start();
  10. p2.start();
  11. p3.start();
  12. p4.start();
  13. p1.join();
  14. p2.join();
  15. p3.join();
  16. p4.join();
  17. System.out.println("开局。。。。");
  18. }
  19. }
  20. class Player extends Thread {
  21. private String name;
  22. private int time;
  23. public Player (String name ,int time) {
  24. this.name = name;
  25. this.time = time;
  26. }
  27. public void run() {
  28. System.out.println(name + "出发了.....");
  29. try {
  30. Thread.sleep(time);
  31. } catch (Exception e) {
  32. // TODO Auto-generated catch block
  33. }
  34. System.out.println(name + "到了...耗时"+time);;
  35. }
  36. }

image_1bpncrpj2d7qoc616h6cm1n6s9.png-61.4kB

  1. package com.learnjava.day08;
  2. public class ThreadDemo04 {
  3. public static void main(String[] args) {
  4. Box b1 = new Box("No1", 3000);
  5. Box b2 = new Box("No2",7000);
  6. Waiter w = new Waiter();
  7. w.setDaemon(true);
  8. b1.start();
  9. b2.start();
  10. w.start();
  11. }
  12. }
  13. class Box extends Thread {
  14. private String no ;
  15. private int time;
  16. public Box(String no ,int time) {
  17. this.no= no ;
  18. this.time = time;
  19. }
  20. public void run() {
  21. System.out.println(no+ "包房开始消费");
  22. try {
  23. Thread.sleep(time);
  24. } catch (Exception e) {
  25. }
  26. System.out.println(no + "号包房消费时间:"+ time+ ",结束消费!");
  27. }
  28. }
  29. // 守护线程
  30. class Waiter extends Thread{
  31. public void run() {
  32. while (true) {
  33. System.out.println(new java.util.Date());
  34. try {
  35. Thread.sleep(1000);
  36. } catch (Exception e) {
  37. }
  38. }
  39. }
  40. }

image_1bpneee5kvqs8s11ajn6ak27um.png-54.3kB

  1. package com.learnjava.day08;
  2. public class ThreadDemo05 {
  3. public static void main(String[] args) {
  4. // TODO Auto-generated method stub
  5. Saler s1 = new Saler("S1");
  6. Saler s2 = new Saler("S2");
  7. s1.start();
  8. s2.start();
  9. }
  10. }
  11. class Saler extends Thread{
  12. static int tickets = 100;
  13. private String name ;
  14. public Saler (String name) {
  15. this.name = name;
  16. }
  17. public void run() {
  18. while (tickets >0) {
  19. System.out.println(name + " : " + (tickets --));
  20. }
  21. }
  22. }

image_1bpnf2b1k19lp1e7t7o24e1rrl13.png-43.6kB

  1. package com.learnjava.day08;
  2. public class ThreadDemo06 {
  3. public static void main(String[] args) {
  4. // TODO Auto-generated method stub
  5. Saler s1 = new Saler("S1");
  6. Saler s2 = new Saler("S2");
  7. s1.start();
  8. s2.start();
  9. }
  10. }
  11. class Saler extends Thread{
  12. static int tickets = 100;
  13. static Object lock = new Object();
  14. private String name ;
  15. public Saler (String name) {
  16. this.name = name;
  17. }
  18. public void run() {
  19. while (true) {
  20. int t = getTicket();
  21. if (t == -1) {
  22. return;
  23. }
  24. else {
  25. System.out.println(name + " : " + t);
  26. }
  27. }
  28. }
  29. // 取票
  30. public int getTicket() {
  31. // 同步代码块
  32. synchronized (lock) {
  33. int t = tickets ;
  34. tickets = tickets -1;
  35. return t <1 ? -1 : t ;
  36. }
  37. }
  38. }

image_1bpo2o0hoqv12ikq85191k1ops1p.png-48.6kB

  1. package com.learnjava.day08;
  2. public class ThreadDemo7 {
  3. public static void main(String[] args) {
  4. // TODO Auto-generated method stub
  5. Object lock = new Object();
  6. Saler s1 = new Saler("S1",lock);
  7. Saler s2 = new Saler("S2",lock);
  8. s1.start();
  9. s2.start();
  10. }
  11. }
  12. // 售票员
  13. class Saler extends Thread{
  14. static int tickets = 100;
  15. Object lock ;
  16. private String name ;
  17. public Saler (String name, Object lock) {
  18. this.name = name;
  19. this.lock = lock;
  20. }
  21. public void run() {
  22. while (true) {
  23. int t = getTicket();
  24. if (t == -1) {
  25. return;
  26. }
  27. else {
  28. System.out.println(name + " : " + t);
  29. }
  30. }
  31. }
  32. // 取票
  33. public int getTicket() {
  34. // 同步代码块
  35. synchronized (lock) {
  36. int t = tickets ;
  37. tickets = tickets -1;
  38. return t <1 ? -1 : t ;
  39. }
  40. }
  41. }

image_1bpo3jnfr104pkg714mgkiv11pl36.png-54.5kB

  1. package com.learnjava.day08;
  2. public class ThreadDemo8 {
  3. public static void main(String[] args) {
  4. // TODO Auto-generated method stub
  5. TicketPool pool = new TicketPool();
  6. Saler s1 = new Saler("S-1", pool);
  7. Saler s2 = new Saler("S-2", pool);
  8. Saler s3 = new Saler("S-3", pool);
  9. s1.start();
  10. s2.start();
  11. s3.start();
  12. }
  13. }
  14. class Saler extends Thread{
  15. private String name ;
  16. private TicketPool pool;
  17. public Saler (String name , TicketPool pool) {
  18. this.name = name;
  19. this.pool = pool;
  20. }
  21. public void run() {
  22. while(true) {
  23. int no = pool.getTicket();
  24. if(no == 0) {
  25. return;
  26. }else {
  27. System.out.println(name + ": " + no);
  28. }
  29. }
  30. }
  31. }
  32. // 票池
  33. class TicketPool {
  34. private int tickets = 200;
  35. //取票
  36. public int getTicket() {
  37. // 同步代码块,以票池本身作为锁旗标
  38. synchronized (this) {
  39. int temp = tickets;
  40. tickets = tickets -1 ;
  41. return temp > 0 ? temp :0;
  42. }
  43. }
  44. }

image_1bpo5c9ngnk6jsqqhdps1q7t50.png-62.5kB

  1. package com.learnjava.day08;
  2. public class ThreadDemo8 {
  3. public static void main(String[] args) {
  4. // TODO Auto-generated method stub
  5. //TicketPool pool = new TicketPool();
  6. Saler s1 = new Saler("S-1");
  7. Saler s2 = new Saler("S-2");
  8. Saler s3 = new Saler("S-3");
  9. s1.start();
  10. s2.start();
  11. s3.start();
  12. }
  13. }
  14. class Saler extends Thread{
  15. private String name ;
  16. public Saler (String name) {
  17. this.name = name;
  18. }
  19. public void run() {
  20. while(true) {
  21. int no = TicketPool.getTicket();
  22. if(no == 0) {
  23. return;
  24. }else {
  25. System.out.println(name + ": " + no);
  26. }
  27. }
  28. }
  29. }
  30. // 票池
  31. class TicketPool {
  32. private static int tickets = 100;
  33. public synchronized static int getTicket() {
  34. // 同步代码块,以票池本身作为锁旗标
  35. //synchronized (this) {
  36. int temp = tickets;
  37. tickets = tickets -1 ;
  38. return temp > 0 ? temp :0;
  39. // }
  40. }
  41. }

image_1bpo5pnlv1q4fk3rtmlotartt5d.png-67.2kB

二: Java 的集合:

  1. list : 列表
  2. java.util.****
  3. java.util.List<Integer>list = new java.util.Arraylist();
  1. 9. wait
  2. 让当前线程进入锁旗标的等待队列,释放cpu 抢占权 还释放锁旗标的监控权。
  3. 解决死锁的问题方式。
  4. Thread.sleep() 释放cpu 的抢占权,和锁旗标没有关系。
  5. 10. notifyall() 通知所有线程可以抢占cpu 锁旗标监控权。

image_1bppu7cvp1ems1n3l1qtd5bas32m.png-591.3kB

  1. public class ThreadDemo9 {
  2. public static void main(String[] args) {
  3. java.util.List<Integer> list = new java.util.ArrayList<>();
  4. Productor p = new Productor("生产者", list);
  5. Consumer c = new Consumer("消费者", list);
  6. p.start();
  7. c.start();
  8. }
  9. }
  10. // 生产者
  11. class Productor extends Thread{
  12. private String name ;
  13. private java.util.List<Integer> list;
  14. public Productor(String name , java.util.List<Integer>list) {
  15. this.name = name;
  16. this.list = list;
  17. }
  18. public void run() {
  19. int i = 0;
  20. while (true) {
  21. list.add(new Integer(i++));
  22. }
  23. }
  24. }
  25. //消费者
  26. class Consumer extends Thread {
  27. private String name ;
  28. private java.util.List<Integer> list;
  29. public Consumer(String name , java.util.List<Integer>list) {
  30. this.name = name;
  31. this.list = list;
  32. }
  33. public void run() {
  34. while (true) {
  35. if (list.size()> 0) {
  36. int i = list.remove(0);
  37. try {
  38. Thread.sleep(2000);
  39. } catch (Exception e) {
  40. }
  41. System.out.println(name + "取出:" + i);
  42. }
  43. }
  44. }
  45. }

image_1bpprpt3sch21o051t2t1sg417qv9.png-72kB

  1. package com.learnjava.day08;
  2. public class ThreadDemo10 {
  3. public static void main(String[] args) {
  4. //集合:
  5. //java.util.List<Integer> list = new java.util.ArrayList<Integer>();
  6. //定义一个pool
  7. Pool pool = new Pool();
  8. Productor p = new Productor("add", pool);
  9. Consumer c = new Consumer("remove", pool);
  10. p.start();
  11. c.start();
  12. }
  13. }
  14. // 生产者
  15. class Productor extends Thread {
  16. private String name ;
  17. // private java.util.List<Integer> list;
  18. private Pool pool;
  19. public Productor (String name ,Pool pool ) {
  20. this.name = name ;
  21. this.pool = pool ;
  22. }
  23. public void run() {
  24. int i = 0;
  25. while (true) {
  26. // 增加
  27. // 生产比较快的方式
  28. pool.add(i++);
  29. System.out.println("add:" + i + " ");
  30. }
  31. }
  32. }
  33. //消费者
  34. class Consumer extends Thread {
  35. private String name ;
  36. // private java.util.List<Integer> list;
  37. private Pool pool;
  38. public Consumer (String name ,Pool pool ) {
  39. this.name = name ;
  40. this.pool = pool ;
  41. }
  42. public void run() {
  43. while (true) {
  44. int i = pool.remove();
  45. try {
  46. Thread.sleep(100);
  47. } catch (Exception e) {
  48. e.printStackTrace();
  49. }
  50. System.out.println("remove:"+ i);
  51. }
  52. }
  53. }
  54. class Pool {
  55. private java.util.List<Integer> list = new java.util.ArrayList<Integer>();
  56. // 最大值:
  57. private int Max = 100;
  58. // 添加元素
  59. public void add (int n) {
  60. synchronized (this) {
  61. try {
  62. if(list.size() >= Max) {
  63. this.wait();
  64. }else {
  65. list.add(n);
  66. this.notify();
  67. }
  68. } catch (Exception e) {
  69. // TODO: handle exception
  70. e.printStackTrace();
  71. }
  72. }
  73. }
  74. // 删除元素
  75. public int remove() {
  76. synchronized (this) {
  77. try {
  78. if(list.size() == 0) {
  79. this.wait();
  80. }
  81. else {
  82. int i = list.remove(0);
  83. this.notify();
  84. return i ;
  85. }
  86. } catch (Exception e) {
  87. e.printStackTrace();
  88. }
  89. }
  90. return -1 ;
  91. }
  92. }

image_1bpt7s5f81hpt1h8v1akg1o0q1n452m.png-63.5kB

  1. package com.learnjava.day08;
  2. public class ThreadDemo10 {
  3. public static void main(String[] args) {
  4. //集合:
  5. //java.util.List<Integer> list = new java.util.ArrayList<Integer>();
  6. //定义一个pool
  7. Pool pool = new Pool();
  8. Productor p1 = new Productor("add", pool);
  9. // Productor p2 = new Productor("add", pool);
  10. Consumer c1 = new Consumer("remove", pool);
  11. Consumer c2 = new Consumer("remove", pool);
  12. p1.start();
  13. // p2.start();
  14. c1.start();
  15. c2.start();
  16. }
  17. }
  18. // 生产者
  19. class Productor extends Thread {
  20. int i = 0;
  21. private String name ;
  22. // private java.util.List<Integer> list;
  23. private Pool pool;
  24. public Productor (String name ,Pool pool ) {
  25. this.name = name ;
  26. this.pool = pool ;
  27. }
  28. public void run() {
  29. //int i = 0;
  30. while (true) {
  31. // 增加
  32. // 生产比较快的方式
  33. pool.add(i++);
  34. System.out.println("add:" + i + " ");
  35. }
  36. }
  37. }
  38. //消费者
  39. class Consumer extends Thread {
  40. private String name ;
  41. // private java.util.List<Integer> list;
  42. private Pool pool;
  43. public Consumer (String name ,Pool pool ) {
  44. this.name = name ;
  45. this.pool = pool ;
  46. }
  47. public void run() {
  48. while (true) {
  49. int i = pool.remove();
  50. try {
  51. Thread.sleep(100);
  52. } catch (Exception e) {
  53. e.printStackTrace();
  54. }
  55. System.out.println("remove:"+ i);
  56. }
  57. }
  58. }
  59. class Pool {
  60. private java.util.List<Integer> list = new java.util.ArrayList<Integer>();
  61. // 最大值:
  62. private int Max = 100;
  63. // 添加元素
  64. public void add (int n) {
  65. synchronized (this) {
  66. try {
  67. if(list.size() >= Max) {
  68. this.wait();
  69. }else {
  70. list.add(n);
  71. System.out.println("size:" + list.size());
  72. this.notify();
  73. }
  74. } catch (Exception e) {
  75. // TODO: handle exception
  76. e.printStackTrace();
  77. }
  78. }
  79. }
  80. // 删除元素
  81. public int remove() {
  82. synchronized (this) {
  83. try {
  84. if(list.size() == 0) {
  85. this.wait();
  86. }
  87. else {
  88. int i = list.remove(0);
  89. this.notify();
  90. return i ;
  91. }
  92. } catch (Exception e) {
  93. e.printStackTrace();
  94. }
  95. }
  96. return -1 ;
  97. }
  98. }

image_1bpt8hq7fges1ha7g501eo54ir33.png-64.1kB

  1. package com.learnjava.day08;
  2. public class ThreadDemo11 {
  3. public static void main(String[] args) {
  4. // 创建篮子
  5. Basket basket = new Basket();
  6. for (int i = 1 ; i <=40 ; i++ ) {
  7. new Worker("Worker -" + i , basket).start();
  8. }
  9. }
  10. }
  11. // 定义工人类
  12. class Worker extends Thread {
  13. private String name ;
  14. private static int Max = 3; // 定义工人吃馒头的最大数
  15. private int count ;
  16. private Basket basket;
  17. public Worker (String name , Basket basket) {
  18. this.name = name ;
  19. this.basket = basket;
  20. }
  21. public void run() {
  22. while (true) {
  23. //1.判断是否吃饱了
  24. if (count >=Max) {
  25. return;
  26. }
  27. //2. 去 取馒头
  28. int no = basket.getManTou();
  29. if (no == 0) {
  30. return ;
  31. }
  32. // 3. 拿到馒头了
  33. count ++ ;
  34. System.out.println(name+ ":" +no);
  35. }
  36. }
  37. }
  38. //篮子
  39. class Basket{
  40. private int count = 100 ;
  41. //同步方法,以当前对象做为锁旗标。
  42. public synchronized int getManTou() {
  43. int temp = count ;
  44. count --;
  45. return temp > 0 ? temp : 0;
  46. }
  47. }

image_1bptiqj9r1cj7iabtttdb0k1h9.png-39.8kB

  1. package com.learnjava.day08;
  2. public class ThreadDemo12 {
  3. public static void main(String[] args) {
  4. HoneyPot honeypot = new HoneyPot();
  5. Bear b1 = new Bear("熊大", honeypot);
  6. Bear b2 = new Bear("熊二", honeypot);
  7. for(int i = 1 ; i <=100 ; i++) {
  8. new Bee("Bee-" + i ,honeypot).start();
  9. }
  10. b1.start();
  11. b2.start();
  12. }
  13. }
  14. class Bee extends Thread{
  15. private String name ;
  16. private HoneyPot honeypot ;
  17. public Bee (String name,HoneyPot honeypot ) {
  18. this.name = name ;
  19. this.honeypot = honeypot;
  20. }
  21. public void run() {
  22. while (true) {
  23. int n = honeypot.add();
  24. System.out.println(name + "生产了蜂蜜, honeypot量:" + n);
  25. }
  26. }
  27. }
  28. class Bear extends Thread{
  29. private String name ;
  30. private HoneyPot honeypot ;
  31. public Bear (String name,HoneyPot honeypot ) {
  32. this.name = name ;
  33. this.honeypot = honeypot;
  34. }
  35. public void run() {
  36. while (true) {
  37. honeypot.remove();
  38. System.out.println(name + "吃掉了蜂蜜:20!");
  39. }
  40. }
  41. }
  42. class HoneyPot{
  43. private int Max = 20 ;
  44. private int count ;
  45. //添加 蜂蜜 +1
  46. public synchronized int add () {
  47. while(count >= Max) {
  48. try {
  49. this.notify();
  50. this.wait();
  51. } catch (InterruptedException e) {
  52. // TODO Auto-generated catch block
  53. e.printStackTrace();
  54. }
  55. }
  56. return ++ count ;
  57. }
  58. // 移除 -20
  59. public synchronized void remove() {
  60. while (count < Max) {
  61. try {
  62. this.wait();
  63. } catch (Exception e) {
  64. // TODO Auto-generated catch block
  65. // e.printStackTrace();
  66. }
  67. }
  68. count = 0;
  69. this.notify();
  70. }
  71. }

111.png-47.2kB

三: Runnable 方法

### 3.1 Runable 方法

  1. java.lang.Runnable
  2. ----
  3. 1. 接口
  4. 2. public void run();
  5. 3. 提供现有类实现线程功能;
  6. 4. 使用Runnable 对象创建线程
  7. new Thread(Runnable r).start()

3.2 线程的四中状态:

image_1bpuv90i9nfsk4s1aqg1m7q37rm.png-229.7kB

  1. package com.learnjava.day08;
  2. public class ThreadDemo13 {
  3. public static void main(String[] args) {
  4. // TODO Auto-generated method stub
  5. new Thread(new Dog()).start();
  6. }
  7. }
  8. class Animal {
  9. private String name;
  10. /**
  11. * @return the name
  12. */
  13. public String getName() {
  14. return name;
  15. }
  16. /**
  17. * @param name the name to set
  18. */
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. }
  23. class Dog extends Animal implements Runnable {
  24. public void eat () {
  25. System.out.println("like bone!");
  26. }
  27. public void run() {
  28. eat();
  29. }
  30. }

image_1bputm98crsad4g54gh2m1pkr9.png-45.2kB

3.3: IDE 集成开发环境

  1. IDE 集成开发环境
  2. integrate development environment
  3. eclipse:
  4. ----
  5. 1. 日蚀
  6. 2. netbeans
  7. 3. idea
  8. 4. borland jbuilder
  9. 5.透视图
  10. 6.视图
  11. view

3.4 线程的状态

  1. new // 尚未运行
  2. runnable // 运行台
  3. blocked // 阻塞状态等待监视器的锁定权
  4. Synchronized(this){}
  5. waiting // 等待状态(无限等待)
  6. 一个线程在等另一个线程特定的操作
  7. timed waiting //
  8. 限时等待,
  9. 等待指定的时间
  10. terminated //
  11. 线程退出之后终止
  12. sleep
  13. 休眠状态

image_1bpvkjtfs10hovro1vugd6v1u1i1g.png-525.9kB

image_1bqbq1ikas6u14bg10sr5ks1idb9.png-352.5kB

  1. 1、新建状态(New):新创建了一个线程对象。
  2. 2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
  3. 3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
  4. 4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
  5. (一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
  6. (二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
  7. (三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
  8. 5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

3.5 String 类:

  1. String
  2. 1. 常量
  3. 2. 字符串池
  4. 3. abc + "cdf"
  5. 4. 字符有编码,charset.
  6. 5. ide 下的默认字符集设置的就是项目编码,和字符集是一个概念
  7. 6. 字符集
  8. GB2312 中文字符集
  9. GBK gb2312 加强版
  10. BIG-5 繁体字符集
  11. ISO-8859-1 西欧码表
  12. UTF-8 国际化编码,可以表示任意文字
  13. gbk
  14. ascii < big-5 < utf-8
  15. iso-8859-1
  16. 7. 字符在内存中存储的都是unicode
  17. c = '\u0098'
  18. c = '中'
  19. 8. 乱码过程
  20. String str = "a 中 b";
  21. str.getBytes();
  22. 9. 字符串遍解码:
  23. 编码(encode : string ---> byte[],str.getByte();
  24. 解码(decode):byte[] --> string ,new String(byte[] ,charset)// 字符集
  25. 10. stringBuffer
  26. -1.字符串缓存区
  27. -2.mutable,可变的
  28. -3.java.lang.abstractStringBulder
  29. ---java.lang.StringBuffer
  30. -4.字符串安全的方法
  31. StringBuilder :
  32. ------
  33. 1. 字符串构建器
  34. 2. mutable 可变的
  35. 3. java.lang.AbstractStringBuilder{ char[] value}
  36. --- java.lang.StringBuilder
  37. 4.不是线程安全的。
  38. Java的基本数据类型:
  39. ---
  40. 1. 数字
  41. byte Byte
  42. short Short
  43. int Integer
  44. long Long
  45. float Float
  46. double Double
  47. 2. boolean Boolean
  48. 3. char Character
  49. bulider 模式
  50. ------
  51. 1. java 设计模式之一
  52. 包装类与基本数据类型的区别
  53. ----
  54. 1. 基本数值类型的默认值是 0
  55. 2. 包装类的默认值是null
  56. 3. 基本类型无法表达null 的概念
  57. 4. 基本类型不是对象
  58. 5.包装类是对象
  59. 6. 参与运算
  60. 基本类型可以直接参与运算
  61. 包装类是对象,不能直接参与运算。
  62. Integer a = new Integer(12);
  63. Integer b = new Integer(13);
  64. a.intValue() + b.intValue() ; //自动拆箱
  65. a.intValue() + b.intvalue();
  66. int i = 6 ,j =7 ;
  67. i+j;
  68. 包装
  69. 自动装箱:
  70. ----
  71. 将基本类型自动转换成包装类对象
  72. 自动拆箱
  73. ----
  74. 将包装类对象自动转换成基本类型
  75. -----
  76. 1. java.lang.String
  77. 2. java.lang.Integer
  78. 3. 常量
  79. String name = "xxxx";
  80. name = "ddd"
  81. for (i < 10000){
  82. name = name + "" + i;
  83. }
  84. byte b = (int) 1234;
  85. String str = 123 + " ";
  86. Object o = new Dog();
  87. Dog d = (Dog)o ;
  88. 4. 创建String 区别
  89. // 一个对象
  90. String str1 = " abc";
  91. // 两个对象
  92. String str2 = new String(abc);
  93. 5.split();
  94. 切割字符串,形成String数组
  95. hello world ,“abc .split (","); 最后的,不生效
  96. 6.String.substring();
  97. 子串
  98. //beginIndex : int
  99. // endindex : int
  100. hello world”.substring(beginIndex,endIndex);
  101. "hello world".substring(6,10);
  102. // 包头不包尾
  1. package com.learnjava.day08;
  2. public class StringDemo01 {
  3. public static void main(String[] args) {
  4. String str0 = 123 + " " ;
  5. String str = "Hello world world";
  6. //串长度,字符的个数
  7. System.out.println(str.length());
  8. str = "hello world中 ";
  9. System.out.println(str.length());
  10. //指定输出那一个 str.charAt(i)
  11. System.out.println(str.charAt(0));
  12. //全部输出
  13. for(int i = 0 ; i<str.length() ; i++ ) {
  14. System.out.println(str.charAt(i));
  15. //复制String中的[],产生新的数组,不会影响原来的数组
  16. char [] arr = str.toCharArray();
  17. //返回字符串在母串中的位置(索引值,以0 为基础)
  18. // 指定开始的位置
  19. int pos = str.indexOf("world",7);
  20. System.out.println(pos);
  21. String s1 = "3Month";
  22. String s2 = "3Year";
  23. String s3 = "3Day";
  24. //判断是以指定的字符结尾:
  25. System.out.println(s1.endsWith("th"));
  26. //判断是以指定的字符开头
  27. System.out.println(s2.startsWith("3"));
  28. str = " hello world";
  29. String [] strr = str.split(" ");
  30. System.out.println(strr.length);
  31. }
  32. }
  33. }

image_1bqbt2807143m1epb17551pmh1haj1m.png-35.2kB

3.6编码表

  1. 1.ascll 美国标准信息交换码。
  2. 用一个字节的7 可以表示
  3. 2. iso 8859-1: 拉丁码表,欧洲码表
  4. 用一个之间的8位表示,无法存储杭州,或者只取了汉子的半。
  5. 使用? 代替,即编码为63.
  6. 3. GB2312 中国的中文编码表
  7. 4. GBK 中过的中午编码表升级,融合了更多的中文文字符号。
  8. 5.unicode: 国际标准吗,融合了多种文字。
  9. 所有文字都用两个字节来表示,Java 语言使用的就是unicode
  10. 6. utf-8 醉多用三个字节来表示一个字符

  1. package com.learnjava.day08;
  2. import java.io.UnsupportedEncodingException;
  3. public class ZiFu {
  4. public static void main(String[] args) throws Exception {
  5. char a = 97;
  6. a = 'a';
  7. a= '\uFFFF';
  8. int ii =5;
  9. String str = "a 中 b";
  10. byte [] bytes = str.getBytes("GBK");
  11. System.out.println(bytes.length);
  12. String NewStr = new String(bytes,"GBK");
  13. System.out.println(NewStr);
  14. }
  15. }

image_1bqc1dl4qe4thug4b14bg8n823.png-29.5kB

3.7 集合数据

  1. 数组:
  2. ---
  3. 1. 元素 类型 必须相同
  4. 2. 长度固定
  5. 3. 地址连续
  6. 4. 通过下标,以0为基址
  7. 5. null指针异常、索引越界异常
  1. 集合
  2. 1.容器
  3. 2. 长度可变
  4. 3. 只能存放对象
  5. 4. 元素可以不相同
  6. 5. 集合都是在类当中
  7. list
  8. ----
  9. interface java.lang.Iterable
  10. /|\
  11. | ----java.util.collection
  12. /|\
  13. | --- interface java.util.list
  14. /|\
  15. | --- class java.util.ArryList
  16. 2.可以存放重复元素
  17. 3. 元素存放时有序
  18. 4. Arrylist 查询块
  19. 慢读取
  20. list.add ()
  21. list.get(int index)
  22. list.remove(int index)
  23. list.clear();
  24. 5. likedList
  25. 链表
  26. 通过手拉手实现对象引用
  27. 存储速度快,查询慢
  28. set
  29. -----
  30. interface java.lang.Iterable
  31. /|\
  32. | ----java.util.collection
  33. /|\
  34. | --- interface java.util.set
  35. 2. 元素不能重复
  36. 3. 元素的存储是无序
  37. 常用三种集合:
  38. ArrayList
  39. HashSet
  40. HashMap
  41. 没有一个是线程安全的
  42. list接口中常用类
  43. 1. Vector : 线程安全,但速度慢,已经被ArrayList 取代
  44. 2. ArrayList: 线程不安全,查询速度快。
  45. 3. LinkedList: 链表结构,增删速度快
  46. 取出list 集合中元素的方式:
  47. - get (int index)
  48. - iterator(); 通过迭代方法获取迭代器取对象。
  49. string
  50. ----
  51. 1. == 判断的是对象的内存地址,不是内容
  52. equals
  53. ---
  54. 1. 判断对象的内容是不是相同。

集合框架的构成分类
image_1bqcg1kle189h1s0shmekjo542g.png-1023.3kB

  1. package com.learnjava.day10;
  2. public class Person {
  3. private String name ;
  4. private int age ;
  5. public String getName() {
  6. return name;
  7. }
  8. public void setName(String name) {
  9. this.name = name;
  10. }
  11. public int getAge() {
  12. return age;
  13. }
  14. public void setAge(int age) {
  15. this.age = age;
  16. }
  17. public Person() {
  18. }
  19. public Person(String name, int age) {
  20. this.name = name;
  21. this.age = age;
  22. }
  23. }
  1. package com.learnjava.day10;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. public class PersonDemo01 {
  6. public static void main(String[] args) {
  7. List<Person> list = new ArrayList<Person>();
  8. Person p = null;
  9. for(int i = 0 ; i<100 ; i++) {
  10. p = new Person();
  11. p.setName("tom" + i);
  12. p.setAge(i%100);
  13. list.add(p);
  14. }
  15. Iterator<Person> it = list.iterator();
  16. while(it.hasNext()) {
  17. Person p1 = it.next();
  18. System.out.println("Person{" + p1.getName() + "," + p1.getAge() + "}");
  19. }
  20. }
  21. }

image_1bqekj95javh1jmu1qf7akpp0o9.png-51.3kB

  1. package com.learnjava.day10;
  2. import java.util.LinkedList;
  3. import java.util.List;
  4. public class LinkedListDemo01 {
  5. public static void main(String[] args) {
  6. List<String> list = new LinkedList<String>();
  7. list.add("hadoop");
  8. list.add(0, "spark");
  9. list.add("hive");
  10. for(int i = 0 ; i <list.size() ; i++ ) {
  11. System.out.println(list.get(i));
  12. }
  13. }
  14. }

image_1bqeur73e1j9n1e7e2971it254e2m.png-35kB

  1. package com.learnjava.day10;
  2. public class StringDemo01 {
  3. public static void main(String[] args) {
  4. String s1 = "abc";
  5. String s2 = "abc";
  6. String s3 = new String("abc");
  7. String s4 = new String("abc");
  8. Person p1 = new Person("tom",1);
  9. Person p2 = new Person("tom",1);
  10. System.out.println(s1==s2);
  11. System.out.println(s3==s4);
  12. System.out.println(s3.equals(s4));
  13. System.out.println(p1 == p2);
  14. System.out.println(p1.equals(p2));
  15. }
  16. }

image_1bqevp0791jc2ea811bp1hhd1o3r33.png-34.8kB

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