java多线程入门

java多线程入门,第1张

一、基本概念
  1. 程序 program:用语言编写的一组指令,一段静态的代码。
  2. 进程 process: 正在执行中的程序。
  3. 线程   thread:进程可细分为多个线程,一条执行路径。每一个线程都有独立的栈和程序计数器pc。 多个线程共用同一个进程中的结构(方法区和堆)。
  4. 单核CPU: 同一时间内只能执行一个线程,只不过是在快速切换,所以是假的多线程。
  5. 多核CPU:同一时间内执行多个线程。
  6. eg: java.exe是多线程,至少有main()主线程、gc()垃圾回收线程、异常处理线程。
  7. 并行:一个CPU同时执行多个任务。
  8. 并发:多个CPU同时执行多个任务。
二、创建线程 创建线程的两种方法

第一种方法:用extends去继承thread   第二种方法:用runnable去创建接口

以多个运动的小球为例 1.创建界面 BallUI 所用技巧:创建窗体(名称、大小、居中显示)、设置必要的组件(创建监听器并让其得到画笔、把鼠标监听器放到窗体中)
public class BallUI {
    public void initUI(){
        JFrame jf = new JFrame();
        jf.setTitle("并发线程");
        jf.setSize(1000,1000);

        //居中显示
        jf.setLocationRelativeTo(null);

        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setVisible(true);


        //给窗体添加鼠标监听器
        ThreadListener listener = new ThreadListener(jf.getGraphics());
        jf.addMouseListener(listener);
    }
    public static void main (String[] args){
        BallUI ui = new BallUI();
        ui.initUI();
        System.out.println("main : "+Thread.currentThread().getName());
    }
}
2.创建ThreadBallExtend   用extends继承Thread

//创建线程的第一种方法:继承 extends Thread
public class ThreadBallExtend extends Thread{
      private int x,y;
      private Graphics g;

       //初始化属性
      public ThreadBallExtend (int x, int y, Graphics g){
          this.x = x;
          this.y = y;
          this.g = g;
      }

      //run方法
    public  void run(){
          while(true){
              System.out.println(this.getName()+"正在运行...");
              try{
                  ThreadBallExtend.sleep(100);}
              catch (InterruptedException interruptedException){interruptedException.printStackTrace();
              }

              //绘制小球
              g.fillOval(x++,y++,60,60);

          }
    }

}
3.创建ThreadListenerRunnable  用runnable去创建接口 implements

通过implements声明自己使用一个或者多个接口,但必须用override重写才能使用

运用run方法使线程处于就绪状态,设置睡眠时间,时间结束后自动释放

public class ThreadListenerRunnable implements Runnable {
    //定义线程类

        private int x,y;
        private Graphics g;

        //初始化属性
        public ThreadListenerRunnable(int x, int y, Graphics g){
            this.x = x;
            this.y = y;
            this.g = g;
        }

        //启动线程后自动执行的方法
        //run 方法执行完该线程结束,该对象的所有内存,数据被释放
        public void run(){
            while(true) {
                System.out.println(Thread.currentThread().getName()+":RUNNABLE 正在运行...");
                try {
                    Thread.sleep(100);
                } catch (Exception interruptedException) {
                    interruptedException.printStackTrace();
                }
                //绘制运动的小球对象
                g.fillOval(x++, y++, 50, 50);
            }
        }
}
4.创建监听器 ThreadListener

因为只需要用到鼠标点击功能,所以用override重写,使鼠标监听器点击时得到画笔及其坐标x,y

当鼠标点击时,启动两种方式建立的线程,可以先注释掉一种方式,执行另一种方式。

此处注释掉了extend的方式,运用runnable接口的方式


    //事件处理类
    public class ThreadListener extends MouseAdapter {
        private Graphics g;  //画笔对象

        //定义set方法,初始化属性
        //构造方法初始化属性
        public ThreadListener(Graphics g){
            this.g = g;
        }

        @Override
        public void mouseClicked(MouseEvent e) {
            int x = e.getX();
            int y = e.getY();

            //第一种方法:创建线程对象
            //ThreadBallExtend tb = new ThreadBallExtend(x,y,g);
            //启动线程:调用Thread类中的start方法
            //每个线程对象只能启动一次
           //tb.start();

           //第二种方法:实现Runnable 接口
            ThreadListenerRunnable runnable = new ThreadListenerRunnable(x,y,g);
            Thread t = new Thread(runnable);
            t.start();

        }

    }

执行后,鼠标点击屏幕出现此效果。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/872244.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存