###25.01_多線(xiàn)程(單例設(shè)計(jì)模式)(掌握)
* 單例設(shè)計(jì)模式:保證類(lèi)在內(nèi)存中只有一個(gè)對(duì)象。
* 如何保證類(lèi)在內(nèi)存中只有一個(gè)對(duì)象呢挎狸?
????* (1)控制類(lèi)的創(chuàng)建,不讓其他類(lèi)來(lái)創(chuàng)建本類(lèi)的對(duì)象。private
????* (2)在本類(lèi)中定義一個(gè)本類(lèi)的對(duì)象砾医。Singleton s;
????* (3)提供公共的訪問(wèn)方式。? public static Singleton getInstance(){return s}
* 單例寫(xiě)法兩種:
????* (1)餓漢式 開(kāi)發(fā)用這種方式衣厘。
????*????? //餓漢式
????????????class Singleton {
????????????????//1,私有構(gòu)造函數(shù)
????????????????private Singleton(){}
????????????????//2,創(chuàng)建本類(lèi)對(duì)象
????????????????private static Singleton s = new Singleton();
????????????????//3,對(duì)外提供公共的訪問(wèn)方法
????????????????public static Singleton getInstance() {
????????????????????return s;
????????????????}
??????????????? public static void print() {
????????????????????System.out.println("11111111111");
????????????????}
????????????}
????* (2)懶漢式 面試寫(xiě)這種方式如蚜。多線(xiàn)程的問(wèn)題压恒?
????*??????????? //懶漢式,單例的延遲加載模式
????????????class Singleton {
????????????????//1,私有構(gòu)造函數(shù)
????????????????private Singleton(){}
????????????????//2,聲明一個(gè)本類(lèi)的引用
????????????????private static Singleton s;
????????????????//3,對(duì)外提供公共的訪問(wèn)方法
????????????????public static Singleton getInstance() {
????????????????????if(s == null)
????????????????????????//線(xiàn)程1,線(xiàn)程2
????????????????????????s = new Singleton();
????????????????????return s;
????????????????}
????????????????public static void print() {
????????????????????System.out.println("11111111111");
????????????????}
????????????}
????* (3)第三種格式
????*??????????? class Singleton {
????????????????private Singleton() {}
????????????????public static final Singleton s = new Singleton();//final是最終的意思,被final修飾的變量不可以被更改
????????????}
###25.02_多線(xiàn)程(Runtime類(lèi))
* Runtime類(lèi)是一個(gè)單例類(lèi)
??????????? Runtime r = Runtime.getRuntime();
????????????//r.exec("shutdown -s -t 300");???? //300秒后關(guān)機(jī)
????????????r.exec("shutdown -a");????????????? //取消關(guān)機(jī)
###25.03_多線(xiàn)程(Timer)(掌握)
* Timer類(lèi):計(jì)時(shí)器
????????????public class Demo5_Timer {
????????????????/**
?????????????????* @param args
?????????????????* 計(jì)時(shí)器
?????????????????* @throws InterruptedException
?????????????????*/
????????????????public static void main(String[] args) throws InterruptedException {
????????????????????Timer t = new Timer();
????????????????????t.schedule(new MyTimerTask(), new Date(114,9,15,10,54,20),3000);
????????????????????while(true) {
????????????????????????System.out.println(new Date());
????????????????????????Thread.sleep(1000);
????????????????????}
????????????????}
????????????}
????????????class MyTimerTask extends TimerTask {
????????????????@Override
????????????????public void run() {
????????????????????System.out.println("起床背英語(yǔ)單詞");
????????????????}
????????????}
###25.04_多線(xiàn)程(兩個(gè)線(xiàn)程間的通信)(掌握)
* 1.什么時(shí)候需要通信
????* 多個(gè)線(xiàn)程并發(fā)執(zhí)行時(shí), 在默認(rèn)情況下CPU是隨機(jī)切換線(xiàn)程的
????* 如果我們希望他們有規(guī)律的執(zhí)行, 就可以使用通信, 例如每個(gè)線(xiàn)程執(zhí)行一次打印
* 2.怎么通信
????* 如果希望線(xiàn)程等待, 就調(diào)用wait()
????* 如果希望喚醒等待的線(xiàn)程, 就調(diào)用notify();
????* 這兩個(gè)方法必須在同步代碼中執(zhí)行, 并且使用同步鎖對(duì)象來(lái)調(diào)用
###25.05_多線(xiàn)程(三個(gè)或三個(gè)以上間的線(xiàn)程通信)
* 多個(gè)線(xiàn)程通信的問(wèn)題
????* notify()方法是隨機(jī)喚醒一個(gè)線(xiàn)程
????* notifyAll()方法是喚醒所有線(xiàn)程
????* JDK5之前無(wú)法喚醒指定的一個(gè)線(xiàn)程
????* 如果多個(gè)線(xiàn)程之間通信, 需要使用notifyAll()通知所有線(xiàn)程, 用while來(lái)反復(fù)判斷條件
###25.06_多線(xiàn)程(JDK1.5的新特性互斥鎖)(掌握)
* 1.同步
????* 使用ReentrantLock類(lèi)的lock()和unlock()方法進(jìn)行同步
* 2.通信
????* 使用ReentrantLock類(lèi)的newCondition()方法可以獲取Condition對(duì)象
????* 需要等待的時(shí)候使用Condition的await()方法, 喚醒的時(shí)候用signal()方法
????* 不同的線(xiàn)程使用不同的Condition, 這樣就能區(qū)分喚醒的時(shí)候找哪個(gè)線(xiàn)程了
###25.07_多線(xiàn)程(線(xiàn)程組的概述和使用)(了解)
* A:線(xiàn)程組概述
????* Java中使用ThreadGroup來(lái)表示線(xiàn)程組,它可以對(duì)一批線(xiàn)程進(jìn)行分類(lèi)管理错邦,Java允許程序直接對(duì)線(xiàn)程組進(jìn)行控制探赫。
????* 默認(rèn)情況下,所有的線(xiàn)程都屬于主線(xiàn)程組撬呢。
????????* public final ThreadGroup getThreadGroup()//通過(guò)線(xiàn)程對(duì)象獲取他所屬于的組
????????* public final String getName()//通過(guò)線(xiàn)程組對(duì)象獲取他組的名字
????* 我們也可以給線(xiàn)程設(shè)置分組
????????* 1,ThreadGroup(String name) 創(chuàng)建線(xiàn)程組對(duì)象并給其賦值名字
????????* 2,創(chuàng)建線(xiàn)程對(duì)象
????????* 3,Thread(ThreadGroup?group, Runnable?target, String?name)
????????* 4,設(shè)置整組的優(yōu)先級(jí)或者守護(hù)線(xiàn)程
????* B:案例演示
????????* 線(xiàn)程組的使用,默認(rèn)是主線(xiàn)程組
? ? ? ? MyRunnable mr = new MyRunnable();
????????Thread t1 = new Thread(mr, "張三");
????????Thread t2 = new Thread(mr, "李四");
????????//獲取線(xiàn)程組
????????// 線(xiàn)程類(lèi)里面的方法:public final ThreadGroup getThreadGroup()
????????ThreadGroup tg1 = t1.getThreadGroup();
????????ThreadGroup tg2 = t2.getThreadGroup();
????????// 線(xiàn)程組里面的方法:public final String getName()
????????String name1 = tg1.getName();
????????String name2 = tg2.getName();
????????System.out.println(name1);
????????System.out.println(name2);
????????// 通過(guò)結(jié)果我們知道了:線(xiàn)程默認(rèn)情況下屬于main線(xiàn)程組
????????// 通過(guò)下面的測(cè)試伦吠,你應(yīng)該能夠看到,默任情況下魂拦,所有的線(xiàn)程都屬于同一個(gè)組
????????System.out.println(Thread.currentThread().getThreadGroup().getName());
????* 自己設(shè)定線(xiàn)程組
????????// ThreadGroup(String name)
????????ThreadGroup tg = new ThreadGroup("這是一個(gè)新的組");
????????MyRunnable mr = new MyRunnable();
????????// Thread(ThreadGroup group, Runnable target, String name)
????????Thread t1 = new Thread(tg, mr, "張三");
????????Thread t2 = new Thread(tg, mr, "李四");
????????System.out.println(t1.getThreadGroup().getName());
????????System.out.println(t2.getThreadGroup().getName());
????????//通過(guò)組名稱(chēng)設(shè)置后臺(tái)線(xiàn)程毛仪,表示該組的線(xiàn)程都是后臺(tái)線(xiàn)程
????????tg.setDaemon(true);
###25.08_多線(xiàn)程(線(xiàn)程的五種狀態(tài))(掌握)
* 看圖說(shuō)話(huà)
* 新建,就緒,運(yùn)行,阻塞,死亡
###25.09_多線(xiàn)程(線(xiàn)程池的概述和使用)(了解)
* A:線(xiàn)程池概述
????* 程序啟動(dòng)一個(gè)新線(xiàn)程成本是比較高的,因?yàn)樗婕暗揭c操作系統(tǒng)進(jìn)行交互芯勘。而使用線(xiàn)程池可以很好的提高性能箱靴,尤其是當(dāng)程序中要?jiǎng)?chuàng)建大量生存期很短的線(xiàn)程時(shí),更應(yīng)該考慮使用線(xiàn)程池荷愕。線(xiàn)程池里的每一個(gè)線(xiàn)程代碼結(jié)束后衡怀,并不會(huì)死亡,而是再次回到線(xiàn)程池中成為空閑狀態(tài)安疗,等待下一個(gè)對(duì)象來(lái)使用抛杨。在JDK5之前,我們必須手動(dòng)實(shí)現(xiàn)自己的線(xiàn)程池茂契,從JDK5開(kāi)始蝶桶,Java內(nèi)置支持線(xiàn)程池
* B:內(nèi)置線(xiàn)程池的使用概述
????* JDK5新增了一個(gè)Executors工廠類(lèi)來(lái)產(chǎn)生線(xiàn)程池,有如下幾個(gè)方法
????????* public static ExecutorService newFixedThreadPool(int nThreads)
????????* public static ExecutorService newSingleThreadExecutor()
????????* 這些方法的返回值是ExecutorService對(duì)象掉冶,該對(duì)象表示一個(gè)線(xiàn)程池真竖,可以執(zhí)行Runnable對(duì)象或者Callable對(duì)象代表的線(xiàn)程。它提供了如下方法
????????* Future<?> submit(Runnable task)
????????* <T> Future<T> submit(Callable<T> task)
????* 使用步驟:
????????* 創(chuàng)建線(xiàn)程池對(duì)象
????????* 創(chuàng)建Runnable實(shí)例
????????* 提交Runnable實(shí)例
????????* 關(guān)閉線(xiàn)程池
????* C:案例演示
????????* 提交的是Runnable
????????// public static ExecutorService newFixedThreadPool(int nThreads)
????????ExecutorService pool = Executors.newFixedThreadPool(2);
????????// 可以執(zhí)行Runnable對(duì)象或者Callable對(duì)象代表的線(xiàn)程
????????pool.submit(new MyRunnable());
????????pool.submit(new MyRunnable());
????????//結(jié)束線(xiàn)程池
????????pool.shutdown();
###25.10_多線(xiàn)程(多線(xiàn)程程序?qū)崿F(xiàn)的方式3)(了解)
* 提交的是Callable
????????// 創(chuàng)建線(xiàn)程池對(duì)象
????????ExecutorService pool = Executors.newFixedThreadPool(2);
????????// 可以執(zhí)行Runnable對(duì)象或者Callable對(duì)象代表的線(xiàn)程
????????Future<Integer> f1 = pool.submit(new MyCallable(100));
????????Future<Integer> f2 = pool.submit(new MyCallable(200));
????????// V get()
????????Integer i1 = f1.get();
????????Integer i2 = f2.get();
????????System.out.println(i1);
????????System.out.println(i2);
????????// 結(jié)束
????????pool.shutdown();
????????public class MyCallable implements Callable<Integer> {
????????????private int number;
????????????public MyCallable(int number) {
????????????????this.number = number;
????????????}
????????????@Override
????????????public Integer call() throws Exception {
????????????????int sum = 0;
????????????????for (int x = 1; x <= number; x++) {
????????????????????sum += x;
????????????????}
????????????????return sum;
????????????}
????????}
* 多線(xiàn)程程序?qū)崿F(xiàn)的方式3的好處和弊端
????* 好處:
????????* 可以有返回值
????????* 可以?huà)伋霎惓?/p>
????* 弊端:
????????* 代碼比較復(fù)雜厌小,所以一般不用
###25.11_設(shè)計(jì)模式(簡(jiǎn)單工廠模式概述和使用)(了解)
* A:簡(jiǎn)單工廠模式概述
????* 又叫靜態(tài)工廠方法模式恢共,它定義一個(gè)具體的工廠類(lèi)負(fù)責(zé)創(chuàng)建一些類(lèi)的實(shí)例
* B:優(yōu)點(diǎn)
????* 客戶(hù)端不需要在負(fù)責(zé)對(duì)象的創(chuàng)建,從而明確了各個(gè)類(lèi)的職責(zé)
* C:缺點(diǎn)
????* 這個(gè)靜態(tài)工廠類(lèi)負(fù)責(zé)所有對(duì)象的創(chuàng)建璧亚,如果有新的對(duì)象增加讨韭,或者某些對(duì)象的創(chuàng)建方式不同,就需要不斷的修改工廠類(lèi)癣蟋,不利于后期的維護(hù)
* D:案例演示
????* 動(dòng)物抽象類(lèi):public abstract Animal { public abstract void eat(); }
????* 具體狗類(lèi):public class Dog extends Animal {}
????* 具體貓類(lèi):public class Cat extends Animal {}
????* 開(kāi)始透硝,在測(cè)試類(lèi)中每個(gè)具體的內(nèi)容自己創(chuàng)建對(duì)象,但是疯搅,創(chuàng)建對(duì)象的工作如果比較麻煩濒生,就需要有人專(zhuān)門(mén)做這個(gè)事情,所以就知道了一個(gè)專(zhuān)門(mén)的類(lèi)來(lái)創(chuàng)建對(duì)象幔欧。
*??????? public class AnimalFactory {
????????????private AnimalFactory(){}
????????????//public static Dog createDog() {return new Dog();}
????????????//public static Cat createCat() {return new Cat();}
????????????//改進(jìn)
????????????public static Animal createAnimal(String animalName) {
????????????????if(“dog”.equals(animalName)) {}
????????????????else if(“cat”.equals(animale)) {
????????????????}else {
????????????????????return null;
????????????????}
????????????}
????????}
###25.12_設(shè)計(jì)模式(工廠方法模式的概述和使用)(了解)
* A:工廠方法模式概述
????* 工廠方法模式中抽象工廠類(lèi)負(fù)責(zé)定義創(chuàng)建對(duì)象的接口罪治,具體對(duì)象的創(chuàng)建工作由繼承抽象工廠的具體類(lèi)實(shí)現(xiàn)丽声。
* B:優(yōu)點(diǎn)
????* 客戶(hù)端不需要在負(fù)責(zé)對(duì)象的創(chuàng)建,從而明確了各個(gè)類(lèi)的職責(zé)觉义,如果有新的對(duì)象增加雁社,只需要增加一個(gè)具體的類(lèi)和具體的工廠類(lèi)即可,不影響已有的代碼晒骇,后期維護(hù)容易霉撵,增強(qiáng)了系統(tǒng)的擴(kuò)展性
* C:缺點(diǎn)
????* 需要額外的編寫(xiě)代碼,增加了工作量
* D:案例演示
????? 動(dòng)物抽象類(lèi):public abstract Animal { public abstract void eat(); }
????????工廠接口:public interface Factory {public abstract Animal createAnimal();}
????????具體狗類(lèi):public class Dog extends Animal {}
????????具體貓類(lèi):public class Cat extends Animal {}
????????開(kāi)始厉碟,在測(cè)試類(lèi)中每個(gè)具體的內(nèi)容自己創(chuàng)建對(duì)象喊巍,但是,創(chuàng)建對(duì)象的工作如果比較麻煩箍鼓,就需要有人專(zhuān)門(mén)做這個(gè)事情崭参,所以就知道了一個(gè)專(zhuān)門(mén)的類(lèi)來(lái)創(chuàng)建對(duì)象。發(fā)現(xiàn)每次修改代碼太麻煩款咖,用工廠方法改進(jìn)何暮,針對(duì)每一個(gè)具體的實(shí)現(xiàn)提供一個(gè)具體工廠。
????????狗工廠:public class DogFactory implements Factory {
????????????public Animal createAnimal() {…}
????????????????}
????????貓工廠:public class CatFactory implements Factory {
????????????public Animal createAnimal() {…}
????????????????}?
###25.13_GUI(如何創(chuàng)建一個(gè)窗口并顯示)
* Graphical User Interface(圖形用戶(hù)接口)铐殃。
*
????????Frame? f = new Frame(“my window”);
????????f.setLayout(new FlowLayout());//設(shè)置布局管理器
????????f.setSize(500,400);//設(shè)置窗體大小
????????f.setLocation(300,200);//設(shè)置窗體出現(xiàn)在屏幕的位置
????????f.setIconImage(Toolkit.getDefaultToolkit().createImage("qq.png"));
????????f.setVisible(true);
###25.14_GUI(布局管理器)
* FlowLayout(流式布局管理器)
????* 從左到右的順序排列海洼。
????* Panel默認(rèn)的布局管理器。
* BorderLayout(邊界布局管理器)
????* 東富腊,南坏逢,西,北赘被,中
????* Frame默認(rèn)的布局管理器是整。
* GridLayout(網(wǎng)格布局管理器)
????* 規(guī)則的矩陣
* CardLayout(卡片布局管理器)
????* 選項(xiàng)卡
* GridBagLayout(網(wǎng)格包布局管理器)
????* 非規(guī)則的矩陣
###25.15_GUI(窗體監(jiān)聽(tīng))
????Frame f = new Frame("我的窗體");
????//事件源是窗體,把監(jiān)聽(tīng)器注冊(cè)到事件源上
????//事件對(duì)象傳遞給監(jiān)聽(tīng)器
????f.addWindowListener(new WindowAdapter() {
??????????????public void windowClosing(WindowEvent e) {
?????????????????????????//退出虛擬機(jī),關(guān)閉窗口
????????????System.exit(0);
????????}
????});
###25.16_GUI(鼠標(biāo)監(jiān)聽(tīng))
###25.17_GUI(鍵盤(pán)監(jiān)聽(tīng)和鍵盤(pán)事件)
###25.18_GUI(動(dòng)作監(jiān)聽(tīng))
###25.19_設(shè)計(jì)模式(適配器設(shè)計(jì)模式)(掌握)
* a.什么是適配器
????* 在使用監(jiān)聽(tīng)器的時(shí)候, 需要定義一個(gè)類(lèi)事件監(jiān)聽(tīng)器接口.
????* 通常接口中有多個(gè)方法, 而程序中不一定所有的都用到, 但又必須重寫(xiě), 這很繁瑣.
????* 適配器簡(jiǎn)化了這些操作, 我們定義監(jiān)聽(tīng)器時(shí)只要繼承適配器, 然后重寫(xiě)需要的方法即可.
* b.適配器原理
????* 適配器就是一個(gè)類(lèi), 實(shí)現(xiàn)了監(jiān)聽(tīng)器接口, 所有抽象方法都重寫(xiě)了, 但是方法全是空的.
????* 適配器類(lèi)需要定義成抽象的,因?yàn)閯?chuàng)建該類(lèi)對(duì)象,調(diào)用空方法是沒(méi)有意義的
????* 目的就是為了簡(jiǎn)化程序員的操作, 定義監(jiān)聽(tīng)器時(shí)繼承適配器, 只重寫(xiě)需要的方法就可以了.
###25.20_GUI(需要知道的)
* 事件處理
????* 事件: 用戶(hù)的一個(gè)操作
????* 事件源: 被操作的組件
????* 監(jiān)聽(tīng)器: 一個(gè)自定義類(lèi)的對(duì)象, 實(shí)現(xiàn)了監(jiān)聽(tīng)器接口, 包含事件處理方法,把監(jiān)聽(tīng)器添加在事件源上, 當(dāng)事件發(fā)生的時(shí)候虛擬機(jī)就會(huì)自動(dòng)調(diào)用監(jiān)聽(tīng)器中的事件處理方法