Java基础---多线程Thread,Component

来源:互联网 发布:java获取ip地址 编辑:程序博客网 时间:2024/06/05 20:21
-----------android培训、java培训、java学习型技术博客、期待与您交流!------------


一、多线程Thread:

1、程序中的执行线程。在Java 虚拟机允许应用程序同时运行多个执行线程。

创建线程的3种方式:

(1)方式1:继承Thread类

A: 创建自定义类,继承于 Thread

B: 在自定义类中,重写Thread类中的run()方法

C: 创建自定义类对象,调用start()方法

(2)方式2: 实现Runnable接口

A: 创建自定义类, 实现Runnale接口

B: 在自定义类中,实现Runnable接口中的run()方法

C: 创建自定义类对象

D: 通过Thread类,创建线程对象,并把自定义对象作为参数使用

E: 启动线程对象

(2)方式3:线程池方式,通过submit()方法,调用Callable接口子类对象

A:继承Thread类

B:Runnable接口

C:通过线程池,访问Callable接口子类对象

2、方式1: 继承Thread类

继承Thread类

A: 创建自定义类,继承于 Thread

B: 在自定义类中,重写Thread类中的run()方法

C: 创建自定义类对象,调用start()方法

// 创建自定义类,继承于 Thread public class MyThread extends Thread { public MyThread() { super(); } public MyThread(String name) { super(name); } // 在自定义类中,重写Thread类中的run()方法  public void run() { for (int i = 0; i < 100; i++) { System.out.println(getName() + "---"+i); } } } public class ThreadDemo { public static void main(String[] args) { // 创建自定义类对象,调用start()方法 //MyThread t1 = new MyThread(); //MyThread t2 = new MyThread(); //通过构造方法,为线程起名字 MyThread t1 = new MyThread("小李"); MyThread t2 = new MyThread("小王"); //开启线程 t1.start(); t2.start(); } } 
3、方式2:

实现Runnable接口

A: 创建自定义类, 实现Runnale接口

B: 在自定义类中,实现Runnable接口中的run()方法

C: 创建自定义类对象

C: 通过Thread类,创建线程对象,并把自定义对象作为参数使用

D: 启动线程对象
public class MyRunnable implements Runnable {// 创建自定义类, 实现Runnale接口 //在自定义类中,实现Runnable接口中的run()方法 public void run() { for (int i = 0; i < 100; i++) { //System.out.println(getName() + "--" + i); System.out.println(Thread.currentThread().getName() + "--"+i ); } } } public class ThreadDemo { public static void main(String[] args) { //创建自定义类对象 MyRunnable my = new MyRunnable(); //通过Thread类,创建线程对象,并把自定义对象作为参数使用 //Thread t1 = new Thread(my); //Thread t2 = new Thread(my); Thread t1 = new Thread(my, "日本"); Thread t2 = new Thread(my, "韩国"); t1.start(); t2.start(); } } 
4、方式3

线程池方式,通过submit()方法,调用Callable接口子类对象

A:继承Thread类

B:Runnable接口

C:通过线程池,访问Callable接口子类对象
public class MyCallable implements Callable { <span style="white-space:pre"> </span>@Override <span style="white-space:pre"> </span>public Object call() throws Exception { <span style="white-space:pre"> </span>System.out.println("Java真好"); <span style="white-space:pre"> </span>System.out.println(Thread.currentThread().getName()); <span style="white-space:pre"> </span>return null; <span style="white-space:pre"> </span>} } import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadDemo { public static void main(String[] args) { //创建线程池对象 ExecutorService service = Executors.newFixedThreadPool(3); //创建Callable接口子类对象 MyCallable my1 = new MyCallable(); MyCallable my2 = new MyCallable(); MyCallable my3 = new MyCallable(); //获取线程池中的线程对象,调用Callable接口子类对象中的call()方法 service.submit(my1); service.submit(my2); service.submit(my3); } } 
5、同步有3种方式

(1)方式1: 同步代码块

锁对象: 任意对象

(2)方式2: 同步方法

锁对象: this

(3)方式3: 同步静态方法

锁对象: 类名.class

6、单例设计模式public class Single {//饿汉式 //构造方法私有 private Single(){} //在当前类中, 创建一个当前类对象,并私有 private static Single s = new Single(); //在当前类中,提供一个public方法,用来获取到创建好的对象 public static Single getInstance(){ return s; } } //懒汉式 public class Single2 { private Single2(){} private static Single2 s = null; public synchronized static Single2 getInstance(){ if (s == null) { s = new Single2(); } return s; } } 7、sleep()和wait()方法的区别sleep(): 休眠要等待时间到达后,自动醒来释放CPU执行权,但不释放锁对象wait(): 等待可以等待时间到达后,自动醒来或者可以通过notify() 或 notifyAll()唤醒释放CPU执行权,同时释放锁对象8、线程的生命周期新建--就绪--运行--死亡 新建--就绪--运行--阻塞--就绪--运行--死亡run()和start()的区别run(): 用来指定线程对象要执行的任务start(): 启动线程,通过JVM底层调用当前线程对象的run()方法9、一个手机生产和卖手机的案例public class Phone { public String brand;//品牌 public String color;//颜色 public boolean isNewPhone = false; //当前变量代表是否有新手机 //true : 代表有新手机, 不生产,等待购买 //false: 代表没有新手机,不购买,等待生产 } public class Producer implements Runnable { <span style="white-space:pre"> </span>//<span style="font-family: Arial, Helvetica, sans-serif;">生产者: Producer, 生产手机</span> private Phone p; int num = 0; public Producer(Phone p) { this.p = p; } public void run() { while (true) { synchronized (p) { // 判断是否有新手机 if (p.isNewPhone) { //有的话,就等待 try { p.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //如果代码执行到了这里,说明,没有新手机,生产手机生产手机模拟生产时间 try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } if (num%2 == 0 ) { p.brand = "华为"; p.color = "黑色"; } else { p.brand = "小米"; p.color = "土豪金"; } System.out.println("生产了:" + p.brand +"--"+ p.color); num++; //更新新手机的标识 为 true p.isNewPhone = true; //通知消费者,购买手机 p.notify(); } } } } public class Consumer implements Runnable { <span style="white-space:pre"> </span>//<span style="font-family: Arial, Helvetica, sans-serif;">消费者: Consumer, 购买手机</span> private Phone p; public Consumer(Phone p) { this.p = p; } public void run() { while (true) { synchronized (p) { // 判断是否有新手机 if (! p.isNewPhone) { //没有的话,就等待 try { p.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //如果执行到了这里,说明有新手机购买手机模拟付款 try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("购买了 : "+ p.brand + "--" + p.color); //更新新手机的标识 为 false p.isNewPhone = false; //4:通知生产商,生产手机 p.notify(); } } } } public class Test { public static void main(String[] args) { //定义一台手机 Phone p = new Phone(); //创建Runnable接口子类对象 Producer producer = new Producer(p); Consumer consumer = new Consumer(p); //创建线程对象 Thread producerThread = new Thread(producer, "生产商"); Thread consumerThread = new Thread(consumer, "消费者"); //启动线程 producerThread.start(); consumerThread.start(); } } 


<span style="background-color: rgb(255, 255, 255); font-family: Arial, Helvetica, sans-serif;">二、Component</span>
<span style="background-color: rgb(255, 255, 255); font-family: Arial, Helvetica, sans-serif;"></span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">1、界面上 显示的所有的组件,可在屏幕上显示,并可与用户进行交互。典型图形用户界面中的按钮、复选框和滚动条</span>

Button 按钮

Canvas 画布

Checkbox 复选框

Label 标签,用来在页面显示文本信息,不能够编辑

List 可滚动的列表

Scrollbar 滚动条

JComponent

JTable 表格

TextComponent

TextField 单行文本框

TextArea 多行文本框(文本域)

Container 容器

Window 窗口

Frame 窗体

Dialog 对话框

FileDialog 文件对话框

Panel 面板

2、Frame


(1)是带有标题和边框的顶层窗口

构造方法:

public Frame() 构造一个最初不可见的 Frame 新实例()。Frame 的标题为空。

(2)方法:

public void show() 方法 显示窗口, 过时了

public void setVisible(boolean b)根据参数 b 的值显示或隐藏此组件。

public void setTitle(String title) 设置标题

public void setSize(int width, int height) 设置窗口大小

public void setSize(Dimension d) 设置窗口大小,传一个尺寸对象

Dimension 类封装单个对象中组件的宽度和高度

public void setLocation(int x, int y) 设置窗口位置

public void setLocation(Point p)设置窗口位置,传一个坐标点对象

3、事件监听机制

A:事件源: 可能要发生时间的对象

a:事件源: 窗体

B:事件: 能够发生哪些事情

b:事件 : 点击关闭窗口

C:事件处理:当事件发生后,对应的处理方式

c:事件处理: 退出程序

D:事件监听:监听事件源,是否有事件发生

d:事件监听: 窗体监听器

4.适配器设计模式

(1)事件源: 银行

事件 :

interface 事件接口 {

存钱

取钱

抢劫

}

(2)事件处理适配器类:

class 事件处理适配器类 implements 事件接口 {

存钱() {

}

取钱() {

}

抢劫() {

}

}

(3)事件处理具体类:

class 事件处理具体类 extends 事件处理适配器类 {

//只需要重写 指定的方法即可

}

(4)事件监听: 一个方法,用来给事件源添加监听的

5、案例
[java] view plaincopyimport java.awt.Frame;  import java.awt.event.WindowListener;    /*  * 测试  *      事件源:  窗体     事件    :  点击关闭窗口     事件处理: 退出程序     事件监听: 窗体监听器  */  public class FrameDemo {          public static void main(String[] args) {               //创建窗体         //事件源:  窗体, 银行         Frame frame = new Frame();         //设置标题          frame.setTitle("人来银行");                   //设置尺寸大小         frame.setSize(500, 500);                   //设置位置          frame.setLocation(400, 100);                   //事件监听: 窗口监听器   摄像头,保安          //public synchronized void addWindowListener(WindowListener l)          //new MyWindowListener();//创建一个保安          //创建一个保安,来监听银行要发生的事件         frame.addWindowListener(new MyWindowListener());                    //显示         frame.setVisible(true);      }  }  import java.awt.event.WindowEvent;  import java.awt.event.WindowListener;   //保安类  public class MyWindowListener implements WindowListener {        public void windowOpened(WindowEvent e) {          // TODO Auto-generated method stub        }        //点击关闭按钮,执行的操作方法            public void windowClosing(WindowEvent e) {         // 退出程序, 结束JVM          System.exit(0);      }        public void windowClosed(WindowEvent e) {        }         public void windowIconified(WindowEvent e) {        }      public void windowDeiconified(WindowEvent e) {        }       public void windowActivated(WindowEvent e) {      }           public void windowDeactivated(WindowEvent e) {        }  }  5.复杂菜单设计[java] view plaincopyimport 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.io.IOException;    public class MenuDemo2 {         public static void main(String[] args) {         //创建窗体          final Frame frame = new Frame("复杂的菜单");          //窗体的标题         final String title = frame.getTitle();                    //设置窗体的大小与位置         frame.setBounds(200, 200, 300, 300);         //-------------------------------------------         //创建菜单栏         MenuBar bar = new MenuBar();         //创建菜单         Menu fileMenu = new Menu("文件");//文件菜单         Menu titleMenu = new Menu("修改标题");//标题菜单                    //创建菜单项         MenuItem mi1 = new MenuItem("打开记事本");          final MenuItem mi2 = new MenuItem("我要学好Java");          final MenuItem mi3 = new MenuItem("我要天天敲代码");          final MenuItem mi4 = new MenuItem("恢复标题");          MenuItem mi5 = new MenuItem("退出");                    //---------         //把打开记事本 添加到文件菜单         fileMenu.add(mi1);                    //把mi2,mi3,mi4 添加到  标题菜单 中         titleMenu.add(mi2);         titleMenu.add(mi3);          titleMenu.add(mi4);         //把标题菜单 添加到 文件菜单中         fileMenu.add(titleMenu);                    //把退出 添加到文件菜单       fileMenu.add(mi5);                             //把文件菜单添加到菜单栏         bar.add(fileMenu);         //把菜单栏添加到窗体中          frame.setMenuBar(bar);          //-------------------------------------------          //为菜单项 添加动作监听          //打开记事本        mi1.addActionListener(new ActionListener() {                            public void actionPerformed(ActionEvent e) {                Runtime r  = Runtime.getRuntime();                 try {                      r.exec("notepad");                } catch (IOException e1) {                       e1.printStackTrace();               }               }          });                    //"我要学好Java"         mi2.addActionListener(new ActionListener() {                               public void actionPerformed(ActionEvent e) {                frame.setTitle(mi2.getLabel());                                }          });                    //我要天天敲代码         mi3.addActionListener(new ActionListener() {                            public void actionPerformed(ActionEvent e) {             frame.setTitle(mi3.getLabel());              }         });                    //恢复标题              mi4.addActionListener(new ActionListener() {                               public void actionPerformed(ActionEvent e) {                  //frame.setTitle(mi4.getLabel());                 frame.setTitle(title);              }          });                              //退出         mi5.addActionListener(new ActionListener() {                            public void actionPerformed(ActionEvent e) {              System.exit(0);                }        });                              //-------------------------------------------          //显示         frame.setVisible(true);      }  }  
0 0
原创粉丝点击