多线程

Posted zhangyuquan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程相关的知识,希望对你有一定的参考价值。

1、多线程是什么。

2、多线程有什么用。

3、多线程的用法。

4、多线程的实际应用。

 

1、多线程是什么。

多线程是在同一个程序内部并行执行,因此会对相同的内存空间进行并发读写操作。一个进程中可以运行多个线程,比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。

 

2、多线程有什么用

多线程有什么用,上面说到,多线程在同一个程序内部并行执行的。假设没有多线程,那么进程执行完当前任务,才能执行下一个任务。那么程序跑起来就会很慢很繁琐,这时候。多线程的作用就体现了出来,多线程可以多任务同时进行。不需要等待当前任务完成就可以执行下一个任务。就像售票窗口。假设只有一个售票窗口。那么100人去买票。只能一个一个买。多线程就像是多售票窗口,有多少人就开多少售票窗口,买票的人不需要等待上一个人买完票就去另一个售票窗口就能进行买票操作。

当然,“同时”执行的人的感觉,在线程之间。实际上是轮流执行的。

 

3、多线程的用法。

使用java.lang.Thread类或者java.lang.Runnable接口编写代码来实现多线程的功能

当线程执行完毕时。javaJVM会自动关闭线程。

Java.lang.Thread类中有个run()方法,当我们要创建多线程时。继承Thread,然后重写run()方法。把需要多线程执行的内容重写到run()方法中。需要启动run()方法时。则调用从Thread类中继承而来的start()方法。

 

4、多线程的实际应用。

       举个例子来实现多线程、

       在一个界面中,点一下让一个小球运动起来,实现多线程。

  那么需要的类:

    界面

    监听器

    小球的线程

界面类代码:

 1 import java.awt.Color;
 2 import java.awt.FlowLayout;
 3 import javax.swing.JFrame;
 4 
 5 public class BallUI {
 6 
 7     // 程序入口
 8     public static void main(String[] args) {
 9         BallUI ballui = new BallUI();
10         ballui.ballui();
11     }
12 
13     public void ballui() {
14         JFrame frame = new JFrame("空白界面");// 窗体实例化
15         frame.setSize(900, 900);// 设置窗体尺寸
16         frame.getContentPane().setBackground(Color.BLACK);// 设置窗体背景颜色为黑
17         // frame.setResizable(false);//设置界面不可改变大小
18         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置关闭时退出
19         frame.setLocationRelativeTo(null);// 设置窗口居中
20         // 监听器实例化
21         framelistener list = new framelistener();
22         // 把监听器添加到窗体
23         frame.addMouseListener(list);
24         // 监听器调用创建窗体的方法
25         list.setframe(frame);
26         frame.setLayout(new FlowLayout());
27         frame.setVisible(true);// 设置窗口可见
28     }
29 }

写好了界面 接下来就是我们的监听器类。

监听器需要鼠标时画图。那么继承java.awt.event.MouseAdapter类再重写public void mousePressed(MouseEvent arg){}方法就可以了。

代码如下:

 1 import java.awt.Graphics;
 2 import java.awt.event.MouseAdapter;
 3 import java.awt.event.MouseEvent;
 4 import java.util.Random;
 5 
 6 import javax.swing.JFrame;
 7 
 8 public class framelistener extends MouseAdapter {
 9     public int x, y;
10     public int r;
11     public JFrame frame;
12     public Graphics g;
13     Random random = new Random();
14 
15     public void setframe(JFrame n) {
16         this.frame = n;
17     }
18     // 鼠标在组件上按下时执行
19     public void mousePressed(MouseEvent arg) {
20         x = arg.getX();
21         y = arg.getY();
22         g = frame.getGraphics();
23         int x2 = random.nextInt(10) + 1;
24         int y2 = random.nextInt(10) + 5;
25         int r = random.nextInt(40) + 20;
26         // 小球线程实例化
27         ThreadBall thread = new ThreadBall( frame, frame.getGraphics(), x, y, x2, y2, r);
28         thread.start();// 调用线程start方法
29     }
30 }

鼠标点击一次,那么调用一次start()方法。就启动一次小球线程。

下面的画小球的线程类

在实例化小球线程类时,把我们需要的参数传进去。就需要写好我们的构造方法。

 1 import java.awt.Color;
 2 import java.awt.Graphics;
 3 import javax.swing.JFrame;
 4 
 5 public class ThreadBall extends Thread {
 6 
 7     JFrame frame;
 8     Graphics g;
 9     Color color;
10     int x,y;
11     int x2,y2;
12     int r;
13 
14     public ThreadBall( JFrame frame, Graphics g,int x,int y,int x2,int y2,int r) {
15         this.frame = frame;
16         this.g = g;
17         this.x=x;
18         this.y=y;
19         this.x2=x2;
20         this.y2=y2;
21         this.r=r;
22     }
23 
24     // 启动线程执行的方法
25     public void run() {
26         while (true) {
27                 g.setColor(Color.black);
28                 g.fillOval(x, y, r, r);
29                 x=x+x2;
30                 y=y+y2;
31                 g.setColor(Color.white);
32                 g.fillOval(x, y, r, r);
33             
34             try {
35                 // 300毫秒
36                 Thread.sleep(300);
37             } catch (InterruptedException e) {
38                 // 异常时
39                 e.printStackTrace();
40             }
41         }
42     }
43 }

跑一下就可以实现一个简单的多线程画小球。

后期发现,球闪烁、出现重影、不美观以及没有暂停、反弹功能,就修改了一下代码。

界面类:

 1 import java.awt.Button;
 2 import java.awt.Color;
 3 import java.awt.FlowLayout;
 4 import java.util.ArrayList;
 5 
 6 import javax.swing.JFrame;
 7 
 8 public class BallUI {
 9 
10     // 程序入口
11     public static void main(String[] args) {
12         BallUI ballui = new BallUI();
13         ballui.ballui();
14     }
15 
16     public void ballui() {
17         JFrame frame = new JFrame("空白界面");// 窗体实例化
18         frame.setSize(900, 900);// 设置窗体尺寸
19         frame.getContentPane().setBackground(Color.BLACK);// 设置窗体背景颜色为黑
20         // frame.setResizable(false);//设置界面不可改变大小
21         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置关闭时退出
22         frame.setLocationRelativeTo(null);// 设置窗口居中
23         // 监听器实例化
24         framelistener list = new framelistener();
25         // 把监听器添加到窗体
26         frame.addMouseListener(list);
27 
28         ArrayList<Ball> ball = new ArrayList<>();// 创建小球数组队列
29 
30         // 监听器调用创建窗体的方法
31         list.setframe(frame, ball);
32 
33         Button button = new Button("暂停");
34         Button button1 = new Button("继续");
35         button.setSize(20, 20);
36         frame.setLayout(new FlowLayout());
37         button.addActionListener(list);
38         button1.addActionListener(list);
39 
40         frame.add(button);
41         frame.add(button1);
42         frame.setVisible(true);// 设置窗口可见
43         //小球线程实例化
44         ThreadBall thread = new ThreadBall(ball, frame, frame.getGraphics());
45         thread.start();// 调用线程start方法
46     }
47 }

监听器类:

 1 import java.awt.Color;
 2 import java.awt.Graphics;
 3 import java.awt.event.ActionEvent;
 4 import java.awt.event.ActionListener;
 5 import java.awt.event.MouseAdapter;
 6 import java.awt.event.MouseEvent;
 7 import java.util.ArrayList;
 8 import java.util.Random;
 9 
10 import javax.swing.JFrame;
11 
12 public class framelistener extends MouseAdapter implements ActionListener {
13     public int x, y;
14     public int r;
15     public JFrame frame;
16     public Graphics g;
17     ArrayList<Ball> ball;
18     Random random = new Random();
19 
20     public void setframe(JFrame n, ArrayList<Ball> ball) {
21         this.frame = n;
22         this.ball = ball;
23     }
24 
25     public void actionPerformed(ActionEvent arg) {
26         String string = arg.getActionCommand();
27         if (string.equals("暂停")) {
28             ThreadBall.pause = false;
29         } else if (string.equals("继续")) {
30             ThreadBall.pause = true;
31         }
32     }
33 
34     // 鼠标在组件上按下时执行
35     public void mousePressed(MouseEvent arg) {
36         x = arg.getX();
37         y = arg.getY();
38         g = frame.getGraphics();
39         int x2 = random.nextInt(10) + 1;
40         int y2 = random.nextInt(10) + 5;
41         int r = random.nextInt(40) + 20;
42         Color color = new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256));
43         Ball b = new Ball(x, y, x2, y2, r, frame, g, color);
44         ball.add(b);
45     }
46 }

小球类:

 1 import java.awt.Color;
 2 import java.awt.Graphics;
 3 
 4 import javax.swing.JFrame;
 5 
 6 public class Ball {
 7     int x,y;
 8     int x2,y2;
 9     int r;
10     JFrame frame;
11     Graphics g;
12     Color color;
13     
14     public Ball(int x,int y,int x2,int y2,int r,JFrame frame,Graphics g,Color color){
15         this.x=x;
16         this.y=y;
17         this.x2=x2;
18         this.y2=y2;
19         this.r=r;
20         this.frame=frame;
21         this.g=g;
22         this.color=color;
23     }
24     
25     public void draw(Graphics g){
26         g.setColor(color);
27         g.fillOval(x+x2, y+x2, r, r);
28     }
29     
30     public void move(JFrame fame,Graphics g){
31         if(x>=frame.getWidth()||x<=0){
32             x2=-x2;
33         }
34         if(y>=frame.getHeight()||y<=0){
35             y2=-y2;
36         }
37         x+=x2;
38         y+=y2;
39     }
40     
41 }

小球线程类:

 1 import java.awt.Graphics;
 2 import java.util.ArrayList;
 3 
 4 import javax.swing.JFrame;
 5 
 6 public class ThreadBall extends Thread {
 7 
 8     JFrame frame;
 9     Graphics g;
10     static boolean pause = true;
11     ArrayList<Ball> ball;
12 
13     public ThreadBall(ArrayList<Ball> ball, JFrame frame, Graphics g) {
14         this.ball = ball;
15         this.frame = frame;
16         this.g = g;
17     }
18 
19     // 启动线程执行的方法
20     public void run() {
21         while (true) {
22             if (pause) {
23                 g.setColor(frame.getContentPane().getBackground());// 获取背景颜色
24                 g.fillRect(0, 0, frame.getWidth(), frame.getHeight());// 画跟跟界面一样大小的背景颜色矩形。
25                 for (int i = 0; i < ball.size(); i++) {
26                     Ball b = ball.get(i);
27                     b.draw(g);
28                     b.move(frame, g);
29                 }
30             }
31             try {
32                 // 300毫秒
33                 Thread.sleep(100);
34             } catch (InterruptedException e) {
35                 // 异常时
36                 e.printStackTrace();
37             }
38         }
39     }
40 }

 

 

以上是关于多线程的主要内容,如果未能解决你的问题,请参考以下文章

线程学习知识点总结

多个请求是多线程吗

python小白学习记录 多线程爬取ts片段

多线程编程

多线程编程

python多线程