• 第18章 多线程----线程简介


    如果一次只完成一件事情,会很容易实现,但现实生活中很多事情都是同时进行的,所以在Java中为了模拟这种状态,引入了线程机制。当程序同时完成多件事情时,就是所谓的多线程程序。使用多线程可以创建窗口程序、网络程序等。

    1、线程简介

    Windows操作系统是多任务操作系统,它以进程为单位。一个进程是一个包含有自身地址的程序,每个独立执行的程序都称为进程,也就是正在执行的程序。

    系统可以分配给每个进程一段有限的使用CPU的时间(也可以称为CPU时间片),CPU在这段时间中执行某个进程,然后下一个时间片又跳至另一个进程中去执行。

    一个线程则是进程中的执行流程,一个进程中可以同时包括多个线程,每个线程也可以得到一小段程序的执行时间,这样一个进程就可以具有多个并发执行的线程。

    2、实现线程的两种方式

    在Java中主要提供两种方式实现线程,分别为继承java.lang.Thread类与实现java.lang.Runnable接口。

    (1)继承Thread类

    Thread类中实例化的对象代表线程,程序员启动一个新线程需要建立Thread实例。

    Thread类中常用的构造方法如下:

    publicThread(String threadName);//创建一个名称为threadName的线程对象
    public Thread();

    例如:在项目中创建ThreadTest类,该类继承Thread类方法创建线程。

    public class ThreadTest extends Thread { // 指定类继承Thread类
        private int count = 10;
        
        public void run() { // 重写run()方法
            while (true) {
                System.out.print(count+" "); // 打印count变量
                if (--count == 0) { // 使count变量自减,当自减为0时,退出循环
                    return;
                }
            }
        }
        
        public static void main(String[] args) {
            new ThreadTest().start();
        }
    }

    (2)Runnable接口

    到目前为止,线程都是通过扩展Thread类来创建的,如果程序员需要继承其他类(非Thread类),而且还要使用当前类实现多线程,那么可以通过Runnable接口来实现。

    注释:一个扩展JFrame类的GUI程序不可能再继承Thread类,因为Java语言中不支持多继承,这时该类需要实现Runnable接口时期具有使用线程的功能。

    例如:在项目中创建SwingAndThread类,该类继承了JFrame类,实现该图标移动的功能,其中使用了Swing与相乘相结合的技术。

    import java.awt.*;
    import java.net.*;
    
    import javax.swing.*;
    
    public class SwingAndThread extends JFrame {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        private JLabel jl = new JLabel(); // 声明JLabel对象
        private static Thread t; // 声明线程对象
        private int count = 0; // 声明计数变量
        private Container container = getContentPane(); // 声明容器
        
        public SwingAndThread() {
            setBounds(300, 200, 250, 100); // 绝对定位窗体大小与位置
            container.setLayout(null); // 使窗体不使用任何布局管理器
            URL url = SwingAndThread.class.getResource("/1.gif"); // 获取图片的URL
            Icon icon = new ImageIcon(url); // 实例化一个Icon
            jl.setIcon(icon); // 将图标放置在标签中
            // 设置图片在标签的最左方
            jl.setHorizontalAlignment(SwingConstants.LEFT);
            jl.setBounds(10, 10, 200, 50); // 设置标签的位置与大小
            jl.setOpaque(true);
            t = new Thread(new Runnable() { // 定义匿名内部类,该类实现Runnable接口
                        public void run() { // 重写run()方法
                            while (count <= 200) { // 设置循环条件
                                 // 将标签的横坐标用变量表示
                                jl.setBounds(count, 10, 200, 50);
                                try {
                                    Thread.sleep(1000); // 使线程休眠1000毫秒
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                                count += 4; // 使横坐标每次增加4
                                if (count == 200) {
                                    // 当图标到达标签的最右边,使其回到标签最左边
                                    count = 10;
                                }
                            }
                        }
                    });
            t.start(); // 启动线程
            container.add(jl); // 将标签添加到容器中
            setVisible(true); // 使窗体可视
            // 设置窗体的关闭方式
            setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        }
        
        public static void main(String[] args) {
            new SwingAndThread(); // 实例化一个SwingAndThread对象
        }
    }

  • 相关阅读:
    android焦点
    URI和URL的区别比较与理解
    Android Bundle类
    repo命令
    ubuntu adb找不到设备
    【python】-网络编程
    【python】-反射
    【python】-类的特殊成员方法
    【python】-7-面向对象的进阶
    【python】-多态
  • 原文地址:https://www.cnblogs.com/chamie/p/4711072.html
Copyright © 2020-2023  润新知