1、实现线程的三种方式
继承 Thread类,并重写run()方法;
实现 Runnable接口,并重写run()方法;
实现 Callable接口,并重写call()方法;
五大状态:新建、就绪、运行、阻塞、死亡;
2、线程的运用
什么是线程?
程序中负责执行的哪个东东就叫做线程(执行路线,进程内部的执行序列),或者说是进程的子任务。
常用函数:
sleep():设置线程休眠时间,单位毫秒;
yield():方法是停止当前线程,让同等优先权的线程运行,如果没有同等优先权的线程,那么Yield()方法将不会起作用。该方法与sleep()类似,只是不能由用户指定暂停多长时间,该方法执行后线程直接进入就绪状态。
join():执行后线程进入阻塞状态,例如在线程B中调用线程A的join(),那线程B会进入到阻塞队列,直到join结束或中断线程B才开始进入阻塞队列。
wait():让线程处于等待状态,并且释放掉抢到的锁旗标,其他线程可以继续抢锁旗标。wait()必须在同步的代码块中执行。
案例一:创四个方法,再进行调用,四个方法哪一个方法抢到了CPU就执行那个
package com.zking.ui; public class Test { public static void main(String[] args) { //实例化线程对象 MyThread1 m1 = new MyThread1(); MyThread1 m2 = new MyThread1(); //m1.run();//错误的使用线程方法 //启用线程 m1.start(); m2.start(); //Runnable方式实现线程 //创建任务对象 MyRunnable m = new MyRunnable(); //创建线程 Thread t1 = new Thread(m); t1.start(); } }
效果展示
案例二:(希望不会挨打)大多数人都喜欢玩游戏,玩游戏的时候会有抽奖,并且抽中的概率是很小的,以下是一个老虎机游戏
package com.zking.ui; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Random; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.UIManager; public class Game_UI extends JFrame{ boolean b = true; JPanel jp = new JPanel(); //第一张图 ImageIcon ia = new ImageIcon("D:\\S2\\丹哥\\API_07\\images\\a3.gif"); JLabel jla = new JLabel(ia); // 第一张图 // ImageIcon ib = new ImageIcon("D:\\S2\\丹哥\\API_07\\images\3.gif"); JLabel jlb = new JLabel(ia); // 第一张图 // ImageIcon ic = new ImageIcon("D:\\S2\\丹哥\\API_07\\images\3.gif"); JLabel jlc = new JLabel(ia); //第一个按钮 JButton jbyyy = new JButton("摇一摇"); JButton jbtyt = new JButton("停一停"); public Game_UI() { this.setTitle("老虎机"); this.setSize(420,350); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLocationRelativeTo(null); // 设置空布局 jp.setLayout(null); // 第一张图片的位置 jla.setBounds(60, 70, 64, 50); // 添加到画布上 jp.add(jla); // 第二张图片的位置 jlb.setBounds(170, 70, 64, 50); // 添加到画布上 jp.add(jlb); // 第三张图片的位置 jlc.setBounds(280, 70, 64, 50); // 添加到画布上 jp.add(jlc); jbyyy.setBounds(60, 180, 100, 40); jp.add(jbyyy); jbtyt.setBounds(220, 180, 100, 40); jp.add(jbtyt); jbyyy.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub b = true; new Thread() { int i = 500; public void run() { while(true) { //随机1-4中间的一个数字 setJlImage(jla); setJlImage(jlb); setJlImage(jlc); if(b) { i-=50; if(i<=1) { i=1; } }else { i+=10; if(i>=500) { break; } } try { Thread.sleep(i); } catch (Exception e2) { e2.printStackTrace(); } } }; }.start(); } }); jbtyt.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub b = false; } }); this.getContentPane().add(jp); this.setVisible(true); } private void setJlImage(JLabel jl) { // TODO Auto-generated method stub Random ran = new Random(); int i = ran.nextInt(4)+1; //创建图片 ImageIcon ii = new ImageIcon("D:\\S2\\丹哥\\API_07\\images\\a" + i + ".gif"); jl.setIcon(ii); } public static void main(String[] args) { try { UIManager.setLookAndFeel("org.jb2011.lnf.beautyeye.BeautyEyeLookAndFeelCross"); } catch (Exception e) { e.printStackTrace(); } new Game_UI(); } }
以下是效果图,运用了窗体美化包