多线程的再度复习.class
1 package com.javami.kudy.Demo.ThreadStudy; 2 3 import java.util.concurrent.locks.Condition; 4 import java.util.concurrent.locks.Lock; 5 import java.util.concurrent.locks.ReentrantLock; 6 7 8 /*class MyArray 9 { 10 缺点: 11 不能准确的去唤醒一个进程.消耗资源.并且要判断... 而下面的.可以准确的唤醒下一个需要执行的.. 12 private int arr[] = new int[10]; 13 private int savepos = 0; 14 private int getpos = 0; 15 private String lock = " "; 16 private int count = 0; 17 //数组的角标是从零开始的,如果关锁了,其他线程在等待.. 18 //但我不断的去抢到存的数据.那时候就乱套了... 19 //存满了,两个存的线程等待,一个取的线程取了一个元素会唤醒一个存的线程 20 //存的线程存了一个,又存满了,然而此时它会唤醒,就会唤醒另一个在等待的存的线程,出错了 21 //解决这个问题很简单,将线程等待的条件放在一个循环里面去判断 22 //而实际上wait方法允许发声虚假唤醒,所以最好放在一个循环里面 23 //但是像上面的做法,存的线程会去唤醒存的线程,没有必要,非常影响程序的效率 24 25 public void add(int num) throws InterruptedException 26 { //0 1 2 3 不while循环.有可能这里有两个存的进程在这里边等待 27 //我不一定要等待你执行完毕~~~但是线程同步,我在执行.你就不能执行..但是锁一开~~我就是while保证了虚假的 唤醒 28 synchronized (lock) { 29 while(count==10) 30 { 31 lock.wait(); 32 } 33 34 if(savepos==10) 35 savepos = 0; 36 arr[savepos++] = num; 37 count++; 38 lock.notify(); //唤醒等待中的进程 39 } 40 } 41 42 public int get() throws InterruptedException 43 { 44 synchronized(lock) 45 { 46 try 47 { 48 while(count==0){ 49 lock.wait(); 50 } 51 if(getpos==10) 52 getpos = 0; 53 count--; 54 return arr[getpos++]; 55 }finally 56 { 57 lock.notify(); 58 } 59 } 60 61 } 62 }*/ 63 64 65 //使用1.5的lock和condition解决存和取之间的通信问题 66 class MyArray 67 { 68 private int[] arr = new int[10]; 69 private int savapos = 0; 70 private int getpos = 0; 71 private int count = 0; 72 Lock lock = new ReentrantLock(); 73 Condition isFull = lock.newCondition(); //必须要获取同一把锁 74 Condition isEmpty = lock.newCondition(); 75 76 public void add(int num) throws InterruptedException 77 { 78 try { 79 lock.lock(); //开锁 80 while(count==10) 81 isFull.await(); //等待 82 if(savapos==10) 83 savapos = 0; 84 arr[savapos++] = num; 85 count++; 86 isEmpty.signal(); 87 } finally 88 { 89 lock.unlock();//关锁 90 } 91 92 } 93 94 public int get() throws InterruptedException 95 { 96 try { 97 lock.lock(); //开锁 98 while(count==0) 99 isEmpty.await();100 if(getpos==10)101 getpos = 0;102 count--;103 return arr[getpos++];104 }finally105 {106 isFull.signal(); //唤醒下一个锁107 lock.unlock(); //我才关闭108 }109 }110 }111 public class ArrayThread {112 113 /**114 * 写一个多线程的程序,实现两个线程存元素,两个线程取元素115 */116 static int num = 0;117 public static void main(String[] args) {118 final MyArray marr = new MyArray();119 120 new Thread(new Runnable() {121 public void run() {122 for(int i=0; i<30; i++) {123 try {124 marr.add(num++);125 } catch (InterruptedException e) {126 // TODO Auto-generated catch block127 e.printStackTrace();128 }129 }130 }131 }).start();132 133 134 new Thread(new Runnable() {135 public void run() {136 for(int i=0; i<30; i++)137 try {138 System.out.println(marr.get());139 } catch (InterruptedException e) {140 // TODO Auto-generated catch block141 e.printStackTrace();142 }143 }144 }).start();145 146 147 new Thread(new Runnable() {148 public void run() {149 for(int i=0; i<30; i++) {150 try {151 marr.add(num++);152 } catch (InterruptedException e) {153 // TODO Auto-generated catch block154 e.printStackTrace();155 }156 }157 }158 }).start();159 160 new Thread(new Runnable() {161 public void run() {162 for(int i=0; i<30; i++)163 try {164 System.out.println(marr.get());165 } catch (InterruptedException e) {166 // TODO Auto-generated catch block167 e.printStackTrace();168 }169 }170 }).start();171 172 }173 174 }
GUI(图形用户界面)
全称:Graphical User Interface。
Java为GUI提供的对象都存在Awt,Swing两个包中。
两个包的特点。
理解组件(Component(父类))与容器(Container(子类))。
Awt
Awt与 Swing
Awt:依赖于本地系统平台,如颜色样式显示。Swing:跨平台。组件与容器
容器是组件的子类,是一个特殊的组件。组件里面不可以存放组件,而容器可以。布局管理器
FlowLayout(流式布局管理器)
从左到右的顺序排列。BorderLayout(边界布局管理器)东,南,西,北,中GridLayout(网格布局管理器)规则的矩阵CardLayout(卡片布局管理器)选项卡GridBagLayout(网格包布局管理器)非规则的矩阵建立一个简单的窗体
1 Container常用子类:Window Panel(面板,不能单独存在。)2 Window常用子类:Frame Dialog3 简单的窗体创建过程:4 Frame f = new Frame(“my window”);5 f.setLayout(new FlowLayout());6 f.setSize(300,400);7 f.setVisible(true);
所有的AWT包中的类会运行在AWT线程上
事件处理机制组成
事件
用户对组件的一个操作,称之为一个事件事件源
发生事件的组件就是事件源事件处理器
某个Java类中负责处理事件的成员方法事件分类
按产生事件的物理操作和GUI组件的表现效果进行分类:
1 MouseEvent2 WindowEvent3 ActionEvent4 ……
按事件的性质分类:
低级事件语义事件(又叫做高级事件)事件监听机制组成
事件源
发生事件的组件对象事件 具体发生的事件监听器 监听器需要注册到具体的对象上,用于监听该对象上发生的事件事件处理 针对某一动作的具体处理办法事件监听机制
确定事件源(容器或组件)
通过事件源对象的addXXXListener(new XXXListener())方法将侦听器注册到该事件源上。
该方法中接收XXXListener的子类对象,或者XXXListener的对应的适配器XXXAdapter的子类对象。
一般用匿名内部类来实现。
在覆盖方法的时候,方法的形参一般是XXXEvent类型的变量。
事件触发后会把事件打包成对象传递给该变量。(其中包括事件源对象。通过getSource()或者,getComponent()获取。)
事件监听机制的设计
EventListenerAdapter
菜单
1 MenuBar,Menu,MenuItem
1 package com.javami.kudyDemo.AwtTest; 2 import java.awt.Button; 3 import java.awt.FlowLayout; 4 import java.awt.Frame; 5 import java.awt.event.MouseAdapter; 6 import java.awt.event.MouseEvent; 7 import java.awt.event.WindowAdapter; 8 import java.awt.event.WindowEvent; 9 public class AddButton { 10 11 /** 12 * @param args 13 * 添加一个按钮,监听按钮.但按钮发生出异常的时候.我们应该做什么/. 14 */ 15 private static Frame f; 16 public static void main(String[] args) { 17 f = new Frame("kudy add Button"); 18 f.setSize(300, 400); 19 f.setLocation(100, 150); 20 f.setLayout(new FlowLayout()); //设置布局 21 Button bt = new Button("点我啊~"); 22 f.add(bt); 23 HandleEvent(f,bt); 24 f.setVisible(true);//可见的 25 } 26 27 private static void HandleEvent(Frame f, Button bt) { 28 f.addWindowListener(new WindowAdapter(){ 29 public void windowClosing(WindowEvent e) 30 { 31 e.getWindow().dispose(); 32 } 33 }); 34 35 //为按钮添加时间监,增加按钮 36 bt.addMouseListener(new MouseAdapter(){ 37 public void mouseClicked(MouseEvent e){ 38 addBtn(); 39 } 40 }); 41 } 42 43 //从外部实现~~ 44 protected static void addBtn() { 45 int num = 1; 46 Button bt = new Button("点就点~~"+num++); 47 f.add(bt); 48 f.setVisible(true); 49 bt.addMouseListener(new MouseAdapter(){ 50 public void mouseClicked(MouseEvent e) 51 { 52 53 Button b = (Button)e.getComponent(); 54 f.remove(b); 55 f.setVisible(true); 56 } 57 }); 58 } 59 60 } 61 62 63 //下面的内容是初懂的时候做的~~不好!! 64 package com.javami.kudyDemo.AwtTest; 65 import java.awt.Button; 66 import java.awt.Component; 67 import java.awt.FlowLayout; 68 import java.awt.Frame; 69 import java.awt.event.MouseEvent; 70 import java.awt.event.MouseListener; 71 import java.awt.event.WindowAdapter; 72 import java.awt.event.WindowEvent; 73 public class FrameTest3 { 74 /* 75 * 添加一个按钮,点击按钮就添加一个新的按钮--点击新的按钮. 76 * 容器继承于组件 77 */ 78 79 public static void main(String[]args) 80 { 81 Frame f = new Frame(); 82 f.setTitle("钟姑娘,相信老公好好奋斗.以后让你过上幸福的生活"); 83 Button bt = new Button("美怡说:爱我吗?"); 84 f.add(bt); 85 86 f.setLayout(new FlowLayout()); //设计窗口为流布式 87 f.setSize(400,200); 88 f.setVisible(true); 89 //监听窗口的事件 90 f.addWindowListener(new WindowAdapter(){ 91 public void windowClosing(WindowEvent e) 92 { 93 Frame f = (Frame)e.getWindow(); 94 f.dispose(); //当触发时间的时候.咱们就把你窗口关了 95 } 96 }); 97 98 bt.addMouseListener(new MyMouseListener(f)); 99 100 }101 }102 103 class MyMouseListener implements MouseListener104 {105 106 /*107 * 组合模式~~~108 */109 Frame f ;110 public MyMouseListener(Frame f) {111 this.f = f;112 }113 @Override114 public void mouseClicked(MouseEvent e) {115 System.out.println("美怡说:爱我吗?");116 Component com = (Component)e.getSource();117 Button b = (Button)com;118 b = new Button("威淏说:爱");119 f.add(b);120 }121 122 @Override123 public void mouseEntered(MouseEvent e) {124 // TODO Auto-generated method stub125 126 }127 128 @Override129 public void mouseExited(MouseEvent e) {130 // TODO Auto-generated method stub131 132 }133 134 @Override135 public void mousePressed(MouseEvent e) {136 // TODO Auto-generated method stub137 138 }139 140 @Override141 public void mouseReleased(MouseEvent e) {142 // TODO Auto-generated method stub143 144 }145 146 }
抓我啊~~小游戏~~嘿嘿:
1 package com.javami.kudyDemo.AwtTest; 2 3 import java.awt.Button; 4 import java.awt.Frame; 5 import java.awt.event.MouseAdapter; 6 import java.awt.event.MouseEvent; 7 import java.awt.event.WindowAdapter; 8 import java.awt.event.WindowEvent; 9 10 public class ButtonGame {11 12 /**13 * @param args14 */15 private static Frame f; 16 public static void main(String[] args) {17 f = new Frame("Button Game_Beta1.0");18 f.setSize(300, 400);19 f.setLocation(100, 200);20 Button btOne = new Button("抓我啊~~");21 Button btTwo = new Button("抓我啊~~");22 btTwo.setVisible(false);23 f.add(btOne,"North");24 f.add(btTwo,"South");25 f.setVisible(true);26 27 handEvent(f,btOne,btTwo);28 }29 private static void handEvent(Frame f2, final Button btOne, final Button btTwo) {30 f2.addWindowListener(new WindowAdapter(){31 public void windowClosing(WindowEvent e)32 {33 e.getWindow().dispose();34 }35 });36 btOne.addMouseListener(new MouseAdapter(){37 public void mouseEntered(MouseEvent e)38 {39 e.getComponent().setVisible(false); //事件源设计为不可见40 btTwo.setVisible(true);41 f.setVisible(true);42 }43 });44 btTwo.addMouseListener(new MouseAdapter(){45 public void mouseEntered(MouseEvent e)46 {47 e.getComponent().setVisible(false); //事件源设计为不可见48 btOne.setVisible(true);49 f.setVisible(true);50 }51 });52 }53 54 }
简单的记事本实现功能(等待更新与完整)
1 package com.javami.kudyDemo.AwtTest; 2 3 import java.awt.Button; 4 import java.awt.Dialog; 5 import java.awt.FileDialog; 6 import java.awt.Frame; 7 import java.awt.Label; 8 import java.awt.Menu; 9 import java.awt.MenuBar; 10 import java.awt.MenuItem; 11 import java.awt.TextArea; 12 import java.awt.Window; 13 import java.awt.event.ActionEvent; 14 import java.awt.event.ActionListener; 15 import java.awt.event.KeyAdapter; 16 import java.awt.event.KeyEvent; 17 import java.awt.event.MouseAdapter; 18 import java.awt.event.MouseEvent; 19 import java.awt.event.WindowAdapter; 20 import java.awt.event.WindowEvent; 21 import java.io.BufferedReader; 22 import java.io.BufferedWriter; 23 import java.io.File; 24 import java.io.FileReader; 25 import java.io.FileWriter; 26 import java.io.IOException; 27 28 29 class MyMenu 30 { 31 private Frame f; 32 private MenuBar mb; //菜单条 33 private Menu fileMenu; //菜单栏部署的下拉式菜单组件。 34 private MenuItem open,save,close; 35 private TextArea text; 36 public MyMenu() 37 { 38 f = new Frame("kudy is notePad(Beta1.0)"); 39 f.setSize(500, 600); 40 f.setLocation(430, 120); 41 mb = new MenuBar(); 42 fileMenu = new Menu("File"); 43 open = new MenuItem("Open(N) Ctrl+N"); 44 save = new MenuItem("Save(S) Ctrl+S"); 45 close = new MenuItem("Close(X)Ctrl+X"); 46 text = new TextArea(100,120); 47 //把下拉组件添加到菜单栏下面 48 fileMenu.add(open); 49 fileMenu.add(save); 50 fileMenu.add(close); 51 mb.add(fileMenu); 52 f.setMenuBar(mb); 53 f.add(text); 54 f.setVisible(true); 55 handieEvent(); 56 } 57 58 private void handieEvent() { 59 f.addWindowListener(new WindowAdapter(){ 60 public void windowClosing(WindowEvent e) 61 { 62 e.getWindow().dispose();//释放资源 63 } 64 }); 65 open.addActionListener(new ActionListener(){ 66 67 @Override 68 public void actionPerformed(ActionEvent e) { 69 openFileDialog(); 70 } 71 72 }); 73 save.addActionListener(new ActionListener(){ 74 75 @Override 76 public void actionPerformed(ActionEvent e) { 77 SaveFileDialog(); 78 } 79 } 80 81 ); 82 close.addActionListener(new ActionListener(){ 83 84 @Override 85 public void actionPerformed(ActionEvent e) { 86 f.dispose();//直接退出 87 } 88 89 }); 90 91 /* 92 * 93 * 键盘的监听器 94 * 95 */ 96 text.addKeyListener(new KeyAdapter(){ 97 public void keyPressed(KeyEvent e) 98 { 99 //监听打开一个文件快捷键100 if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_N)101 openFileDialog();102 //监听另存为快捷键-->83103 if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_S)104 SaveFileDialog();105 //退出怎么监听呢?各位大牛~~106 }107 });108 }109 110 protected void SaveFileDialog() {111 //1.创建保存对话框(写入)112 FileDialog saveDialog = new FileDialog(f,"save as",FileDialog.SAVE);113 //2.设置对话框可见114 saveDialog.setVisible(true); 115 String dirName = saveDialog.getDirectory();//获取目录116 String fileName = saveDialog.getFile();//获取文件117 File file = new File(dirName,fileName);118 try {119 saveFile(file);120 } catch (IOException e1) {121 // TODO Auto-generated catch block122 e1.printStackTrace();123 }124 }125 126 /*127 * 另存为功能的实现128 */129 protected void saveFile(File file) throws IOException {130 BufferedWriter bw = null;131 try132 {133 bw = new BufferedWriter(new FileWriter(file));134 String data = text.getText();135 bw.write(data); //不需要换行.由于我们在读取数据的时候已经换行了136 }finally137 {138 if(bw!=null)139 bw.close();140 }141 }142 143 protected void openFileDialog() {144 //1.创建一个文件对话框对象145 FileDialog openDialog = new FileDialog(f,"file",FileDialog.LOAD);146 //2.设置对话框为可见,会发生阻塞,直到用户选中文件147 openDialog.setVisible(true);148 //3.获取用户选中的文件所有的目录和文件的文件名149 String dirName = openDialog.getDirectory();150 String fileName = openDialog.getFile();151 //4.创建File对象152 File file = new File(dirName,fileName);153 //5.判断file是否存在,如果不存在,弹出错误的面板154 if(!file.exists()){155 //如果不存在,创建一个错误的面板156 openErrorDialog(file);157 return;//结束158 }159 //6.通过Io流将文件内容读取进来,存入Text160 try {161 openFile(file);162 } catch (IOException e) {163 // TODO Auto-generated catch block164 e.printStackTrace();165 }166 }167 168 169 private void openFile(File file) throws IOException {170 //1.创建流文件171 BufferedReader br = null;172 try173 {174 br = new BufferedReader(new FileReader(file));175 //2.清空文本域..把之前的内容请空176 text.setText("");177 //3.while读取,读一行,存一行178 String line;179 while((line=br.readLine())!=null)180 {181 text.append(line);182 text.append("\r\n");//读完一行换行183 }184 }finally185 {186 if(br!=null)187 br.close();188 }189 }190 191 /*192 * 错误的对话框内容193 */194 private void openErrorDialog(File file) {195 Dialog error = new Dialog(f,"error!",true);196 error.setSize(300,100);197 error.setLocation(180, 250);198 //Label 对象是一个可在容器中放置文本的组件。一个标签只显示一行只读文本。文本可由应用程序更改,但是用户不能直接对其进行编辑。 199 error.add(new Label("Sorry,文件不存在 \t"+200 file.getName()),"Center");201 Button bt = new Button("Confirm");202 error.add(bt,"South");203 bt.addMouseListener(new MouseAdapter(){204 //鼠标监听器205 public void mouseClicked(MouseEvent e)206 {207 ((Window)(e.getComponent().getParent())).dispose();208 }209 });210 error.setVisible(true);211 }212 }213 214 215 public class MyMenuTest {216 217 /**218 * 记事本工具的实现219 */220 public static void main(String[] args) {221 MyMenu my = new MyMenu();222 }223 224 }
简单的资源管理器(还有很多功能没有做好啦~~)
1 package com.javami.kudyDemo.AwtTest; 2 3 import java.awt.Button; 4 import java.awt.Frame; 5 import java.awt.List; 6 import java.awt.Panel; 7 import java.awt.TextField; 8 import java.awt.event.ActionEvent; 9 import java.awt.event.ActionListener; 10 import java.awt.event.MouseAdapter; 11 import java.awt.event.MouseEvent; 12 import java.awt.event.WindowAdapter; 13 import java.awt.event.WindowEvent; 14 import java.io.File; 15 16 class MyList 17 { 18 private Frame f; 19 //TextField 对象是允许编辑单行文本的文本组件。 20 private TextField tf; 21 //按钮 22 private Button bt; 23 //List 组件为用户提供了一个可滚动的文本项列表。可设置此 list,使其允许用户进行单项或多项选择。 24 private List l; 25 private Panel p; 26 public MyList() 27 { 28 f = new Frame("资源管理Beta1.0"); 29 f.setSize(400,500); 30 f.setLocation(100, 100); //位置 31 32 tf = new TextField(42); 33 bt = new Button("Go~!"); 34 l = new List(40); 35 36 p = new Panel(); //面板 37 p.add(tf,"West");//南 38 p.add(bt,"East");//东 39 p.add(l,"Center");//中 40 41 f.add(p,"North"); //北 42 f.add(l,"Center"); 43 f.setVisible(true); 44 45 handleEvent(); 46 } 47 48 49 //触发事件 50 private void handleEvent() { 51 f.addWindowListener(new WindowAdapter(){ 52 public void windowClosing(WindowEvent e) 53 { 54 e.getWindow().dispose(); //关闭 55 } 56 }); 57 bt.addMouseListener(new MouseAdapter(){ 58 public void mouseClicked(MouseEvent e) 59 { 60 disPlayFile(); 61 } 62 }); 63 64 //监听List 65 l.addActionListener(new ActionListener(){ 66 67 @Override 68 public void actionPerformed(ActionEvent e) { 69 //获取一个文件名 70 String fileName = l.getSelectedItem(); 71 //获得文件的所在目录 72 String dirName = tf.getText(); 73 if(dirName.endsWith(":")); 74 dirName+="\\"; 75 //创建File对象 76 File file = new File(dirName,fileName); 77 //判断是目录还是标准的文件 78 if(file.isDirectory()) 79 { 80 //取出文件名,将文件名给文本域 81 tf.setText(file.getAbsolutePath()); 82 // 83 disPlayFile();//又走入下一个目录 84 }else 85 { 86 try 87 { 88 Runtime.getRuntime().exec("cmd /c " + 89 file.getAbsolutePath()); 90 }catch(Exception ex) 91 { 92 ex.printStackTrace(); 93 System.out.println("打开失败"); 94 } 95 } 96 } 97 98 }); 99 }100 101 102 protected void disPlayFile() {103 //1.获得文本域输入的内容104 String dirName = tf.getText();105 //2.创建File对象106 //如果是以冒号结尾,应该加上:\\107 if(dirName.endsWith(":"))108 dirName+="\\";109 File dir = new File(dirName);110 if(!dir.isDirectory())111 return ;112 //4.如果是目录,遍历目录下所有的文件113 String[]fileNames = dir.list();114 //5.list要清空115 l.removeAll();116 for(String fileName :fileNames )117 l.add(fileName);118 }119 }120 public class FileList {121 public static void main(String[]args)122 {123 MyList ml = new MyList();124 }125 }
个人学习心得:
总体来说都坚持过来了~~但是时间方面处理不够好~~由于晚上精神不是很好!!代码需要复习.重要的是掌握好思路..
加油..