張三 第1天,看0頁,還剩100頁 張三 第2天,看9頁,還剩91頁 張三 第3天,看15頁,還剩76頁 張三 第4天,看19頁,還剩57頁 張三 第5天,看4頁,還剩53頁 張三 第6天,看1頁,還剩52頁 張三 第7天,看13頁,還剩39頁 張三 第8天,看11頁,還剩28頁 張三 第9天,看2頁,還剩26頁 張三 第10天,看16頁,還剩10頁 張三 第11天,看10頁,還剩0頁 李四 第1天,看5頁,還剩95頁 李四 第2天,看6頁,還剩89頁 李四 第3天,看14頁,還剩75頁 李四 第4天,看2頁,還剩73頁 李四 第5天,看18頁,還剩55頁 李四 第6天,看6頁,還剩49頁 李四 第7天,看5頁,還剩44頁 李四 第8天,看8頁,還剩36頁 李四 第9天,看1頁,還剩35頁 李四 第10天,看3頁,還剩32頁 李四 第11天,看8頁,還剩24頁 李四 第12天,看5頁,還剩19頁 李四 第13天,看5頁,還剩14頁 李四 第14天,看4頁,還剩10頁 李四 第15天,看10頁,還剩0頁
一、兩人分別讀-使用單線程java
package com.demo.thread; import java.util.Random; public class Ttest02 { public static void main(String[] args) { int bookPage = 100; read("張三", bookPage); read("李四", bookPage); } public static void read(String name, int bookPage) { if (bookPage < 1) return; int readDays = 1; while (bookPage > 0) { int k = (int) (new Random().nextDouble() * 20); if (bookPage - k < 0) { k = bookPage; } bookPage = bookPage - k; System.out.println(name + "\t" + "第" + (readDays++) + "天," + "看" + k + "頁,還剩" + bookPage + "頁"); } } }
二、兩人分別讀-使用多線程多線程
package com.demo.thread; import java.util.ArrayList; import java.util.List; import java.util.Random; public class Ttest01 { public static void main(String[] args) { int bookPage = 100; Reader r1 = new Reader("張三", bookPage); Reader r2 = new Reader("李四", bookPage); r1.start(); r2.start(); while (true) { if (r1.isAlive() == false && r2.isAlive() == false) { print(r1, r2); break; } } } public static void print(Reader... readers) { for (Reader r : readers) { for (String s : r.getReadRecords()) { System.out.println(s); } } } } class Reader extends Thread { private int bookPage = 0; private int readDays = 1; private List<String> readRecords = new ArrayList<String>(); public Reader(String name, int bookPage) { this.setName(name); this.bookPage = bookPage; } @Override public void run() { if (bookPage < 1) return; while (bookPage > 0) { int k = (int) (new Random().nextDouble() * 20); if (bookPage - k < 0) { k = bookPage; } bookPage = bookPage - k; readRecords.add(Thread.currentThread().getName() + "\t" + "第" + (readDays++) + "天," + "看" + k + "頁,還剩" + bookPage + "頁"); } } public List<String> getReadRecords() { return readRecords; } }
第1天 張三 看10頁,還剩90頁 第2天 李四 看16頁,還剩74頁 第3天 張三 看17頁,還剩57頁 第4天 李四 看17頁,還剩40頁 第5天 張三 看10頁,還剩30頁 第6天 李四 看19頁,還剩11頁 第7天 李四 看7頁,還剩4頁 第8天 李四 看4頁,還剩0頁
三、兩人共讀-使用單線程dom
package com.demo.thread; import java.util.Random; public class Ttest03 { private static int bookPage = 100; public static void main(String[] args) { String[] users = new String[] { "張三", "李四" }; int readDays = 1; while (bookPage > 0) { int n = (int) (new Random().nextDouble() * 2); String name = users[n]; int k = (int) (new Random().nextDouble() * 20); if (bookPage - k < 0) { k = bookPage; } bookPage = bookPage - k; System.out.println("第" + (readDays++) + "天\t"+name + "\t" + "看" + k + "頁,還剩" + bookPage + "頁"); } } }
四、兩人共讀-多線程ide
package com.demo.thread; import java.util.Random; 、、、不正確的,須要修改變量的共享方式 public class Ttest04 { private static volatile int bookPage = 100; private static volatile int readDays = 1; public static void main(String[] args) { User u1 = new User("張三"); User u2 = new User("李四"); u1.start(); u2.start(); } public synchronized void read(String name){ while (bookPage > 0) { int k = (int) (new Random().nextDouble() * 20); if (bookPage - k < 0) { k = bookPage; } bookPage = bookPage - k; System.out.println(name + "\t" + "第" + (readDays++) + "天," + "看" + k + "頁,還剩" + bookPage + "頁"); } } } class User extends Thread{ public User(String name) { this.setName(name); } @Override public void run() { new Ttest04().read(this.getName()); } }