黑马程序员——基础学习(十四)多线程(Thread)和图形界面编程(GUI)
2015-07-17 22:11
666 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
B:SetThread
C:GetThread
D:StudentDemo
B:notify()
C:notifyAll()
B:暂停线程
C:加入线程
D:守护线程
b:start()启动线程,并调用run()
阻塞
实现Runnable接口
实现Runnable接口的步骤:
A:自定义类MyRunnable实现Runnable接口
B:重写run()方法
C:创建MyRunnable的对象
D:创建Thread类的对象,并把MyRunnable的对象作为构造参数传递
public Thread(Runnable target) {}
Thread(Runnable target, String name)
wait():可以指定时间,也可以不指定时间。释放锁。
B:行为型模式 模板设计模式
C:结构型模式 迭代器模式
分析:如何实现类在内存中只有一个对象?
A:让外界不能创建对象,其实就是把构造方法私有。
B:在成员位置创建一个本类的对象。
C:提供一个公共的方法让外界访问。
作用:保证类在内存中只有一个对象
分析:
A:构造私有
B:本身提供一个对象
C:提供公共的方式让别人使用
Thread(多线程)
同步方法及其锁对象
this静态同步方法其锁对象
类名.class死锁
就是两个线程都进入锁,而都在等待对方释放锁造成的程序停滞现象我的代码:
public class DieLock extends Thread { private boolean flag; public DieLock() { } public DieLock(boolean flag) { this.flag = flag; } public void run() { if (flag) { while (true) { synchronized (MyLock.lockA) { System.out.println("if lockA"); synchronized (MyLock.lockB) { System.out.println("if lockB"); } } } } else { while (true) { synchronized (MyLock.lockB) { System.out.println("else lockB"); synchronized (MyLock.lockA) { System.out.println("else lockA"); } } } } } }
线程间通信
A:StudentB:SetThread
C:GetThread
D:StudentDemo
等待唤醒机制
A:wait()B:notify()
C:notifyAll()
几个常见方法
A:线程优先级B:暂停线程
C:加入线程
D:守护线程
run()和start()的区别
a:run()封装了被线程执行的代码b:start()启动线程,并调用run()
线程生命周期
新建,就绪,运行,死亡阻塞
实现多线程的方式有两种
继承Thread类实现Runnable接口
实现Runnable接口的步骤:
A:自定义类MyRunnable实现Runnable接口
B:重写run()方法
C:创建MyRunnable的对象
D:创建Thread类的对象,并把MyRunnable的对象作为构造参数传递
public Thread(Runnable target) {}
Thread(Runnable target, String name)
我的代码:
public class MyRunnableDemo { public static void main(String[] args) { // 创建MyRunnable的对象 MyRunnable my = new MyRunnable(); // 创建Thread类的对象,并把MyRunnable的对象作为构造参数传递 Thread t1 = new Thread(my, "kevin"); Thread t2 = new Thread(my, "david"); t1.start(); t2.start(); } }
sleep()和wait()的区别
sleep():必须指定时间。不释放锁。wait():可以指定时间,也可以不指定时间。释放锁。
设计模式:
就是前人总结的一些经验供我们使用。设计模式的分类:
A:创建型模式 工厂模式,单例设计模式B:行为型模式 模板设计模式
C:结构型模式 迭代器模式
单例设计模式:
类在内存中只有一个对象。分析:如何实现类在内存中只有一个对象?
A:让外界不能创建对象,其实就是把构造方法私有。
B:在成员位置创建一个本类的对象。
C:提供一个公共的方法让外界访问。
作用:保证类在内存中只有一个对象
分析:
A:构造私有
B:本身提供一个对象
C:提供公共的方式让别人使用
代码体现:
A:饿汉式class Student { private Student(){} private static Student s = new Student(); public static Student getStudent() { return s; } } B:懒汉式class Student { private Student(){} private static Student s = null; public static synchronized Student getStudent() { if(s == null) { s = new Student(); } return s; } }懒汉式的优点:
A:延迟加载
B:线程安全GUI
图形界面编程概念
GUI:图形界面编程 操作方便直观
CLI:命令行窗口 需要记忆一些命令,比较麻烦包:
java.awt 和系统关联较强
javax.swing 纯Java实现,与系统无关GUI继承体系
组件:
基本组件 按钮,文本框等
容器组件 窗体或者面板
案例:
A:第一个窗体案例
B:窗体案例可以关闭了
C:窗体中添加按钮,并对按钮添加事件
D:把文本框里面的值赋值给文本域
E:IO流和GUI的结合
F:单级菜单案例
G:多级菜单案例事件监听机制和适配器设计模式
A:事件监听机制
事件源
事件
事件处理
事件监听
B:适配器设计模式
接口中方法较多的时候,提供一个适配器类。
接口:
适配器类:
具体类:我的代码:
需求1:
在窗体上添加一个按钮,并对按钮添加一个事件,做这样的一件事情,每次点击按钮,在控制台输出一句话:你在点试试。import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class ButtonDemo { public static void main(String[] args) { // 创建窗体对象 Frame f = new Frame("添加按钮"); f.setSize(400, 300); f.setLocation(400, 200); //更改布局方式 f.setLayout(new FlowLayout()); // 创建按钮对象 Button bu = new Button("点我啊"); // 设置按钮大小 // bu.setSize(20, 10); // 把按钮添加到窗体 f.add(bu); // 给窗体加一个关闭事件 f.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); //给按钮添加一个事件 //ActionListener动作监听 bu.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("你在点试试。"); } }); // 显示窗体 f.setVisible(true); } }
需求2:实现一个多级菜单:
菜单的儿子可以是菜单,也可以是菜单项目。import java.awt.Frame; import java.awt.Menu; import java.awt.MenuBar; import java.awt.MenuItem; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; public class MenuDemo3 { public static void main(String[] args) { // 创建窗体对象 final Frame f = new Frame("多级菜单"); f.setSize(400, 300); f.setLocation(400, 200); // 创建菜单栏 MenuBar mb = new MenuBar(); // 创建菜单 Menu m1 = new Menu("文件"); Menu m2 = new Menu("更改标题"); Menu m3 = new Menu("帮助"); // 记录以前的标题 final String title = f.getTitle(); // 创建菜单项 MenuItem mi1 = new MenuItem("好好学习"); MenuItem mi2 = new MenuItem("天天向上"); MenuItem mi3 = new MenuItem("恢复标题"); MenuItem mi4 = new MenuItem("退出系统"); MenuItem mi5 = new MenuItem("打开记事本"); MenuItem mi6 = new MenuItem("打开计算器"); // 给菜单添加菜单项 m2.add(mi1); m2.add(mi2); m2.add(mi3); m1.add(m2); m1.add(mi4); m3.add(mi5); m3.add(mi6); // 把菜单和菜单栏连接起来 mb.add(m1); mb.add(m3); // 设置菜单栏 f.setMenuBar(mb); f.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); // 退出系统 mi4.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.exit(0); } }); // 打开记事本 mi5.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Runtime r = Runtime.getRuntime(); try { r.exec("notepad"); } catch (IOException e1) { e1.printStackTrace(); } } }); // 打开计算器 mi6.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Runtime r = Runtime.getRuntime(); try { r.exec("calc"); } catch (IOException e1) { e1.printStackTrace(); } } }); // 好好学习 mi1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { f.setTitle("好好学习"); } }); // 天天向上 mi2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { f.setTitle("天天向上"); } }); // 恢复标题 mi3.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { f.setTitle(title); } }); f.setVisible(true); } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- Python3写爬虫(四)多线程实现数据爬取
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树