多线程实现简单窗体绘制

并发编程

第一章 多线程



前言

一个人专心致志做一件事,会很容易被计算机实现,比如说递归运算,但现实中有很多事情都是同时进行的,比方说在厨房做饭。Java为了模仿这种状态,引入了线程机制,这也是并发编程的最初实现机制。


一、线程机制是什么?

    线程是进程的组成单位,某些机构宣传的时候,会提出一些概念,叫做“多进程,高并发,线程池”。程序员可以在程序中执行多个线程,其中每一个线程完成一个功能,并且有着并发编程的机制。
    Windows操作系统是多任务操作系统,它以进程为基本运行单位。进程的意思就是一个正在运行的程序,系统可以分配给每段进程有限的使用CPU时间,依据一定的处理机调度机制,一段程序执行完后,另一段程序继续上,由于CPU的运行速度很快,所以给人以程序可以同时执行的误解。
    

二、使用步骤

1.拓展Threads类实现线程

代码如下(继承 java.lang.Thread类):
继承Threads类,创建一个新线程

import java.lang.Thread;
/*
* 项目中创建ThreadTest类,这个类继承Thread类方法创建线程
*
* 一个类继承Thread类后,就可以在该类中覆盖run()方法,将实现该线程功能的代码写入run方法中
* 同时调用Thread类中的start执行线程
*
*
* */
public class ThreadTest extends Thread{ //指定类继承Thread类
    private int count=10;
    //重写run方法,Thread对象需要一个任务来执行,任务是指线程启动时候执行的工作
    public void run(){
        //这里头写的是功能代码
        /**
        * 永真式如何跳出循环
        * 通常在run方法中使用无限循环的形式,,使得线程一直运行下去,故要取出一个跳出循环的条件
        * */
        while (true){
            System.out.print(count+" ");//打印count变量
            if(--count==0){
                //使count变量自减,当自减为0时,退出循环
                return;
            }
        }

    }
    //主方法的线程启动由虚拟机负责
    /**
     * main方法中,使得线程执行,需要调用Thread类中的start方法,start方法调用被覆盖的run方法
     * 如果不调用run方法,那么线程永远都不会启动
     * 主方法没有调用start方法之前,Thread方法只是一个实际例子,而不是一个真正线程
     *
     *start方法调用一个已经启动的线程,会抛出异常
     *

     */
    public static void main(String[] args){
        new ThreadTest().start();
    }

}

2.实现Runnable接口

代码如下(实现Runnable接口):
建立Runnnable对象
使用参数为Runnnable对象创造Threads实际例子
调用start方法创造线程

import javax.swing.*;
import java.awt.*;
import java.net.URL;

/**
 * 创建 SwingAndThread类,这个类继承了JFrame,实现了图标移动功能
 * Runnable--->Thread---->start方法启动线程,实现run方法
 *
 * 为了使图标滚动,用类的构造方法创建Thread实例
 * Runnable 作为Threads类构造方法的参数
 * 内部类形式实现Run方法,主要环图标的位置,当图标位置到达横坐标的最右边时,再将
 * 很横坐标安置在图标滚动初始位置
 *
 *启动一个新线程,并不是直接调用Thread子类对象中的Run方法,而是调用Thread子类中的start方法
 * Thread中的start方法产生一个新的线程,该线程运行Thread子类的run方法
 *
 */
public class SwingAndThread extends JFrame {
    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);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    count +=4;//横坐标每次加四
                    if(count==200){
                        count=10;
                    }
                }

            }
        });
        t.start();//启动线程
        container.add(jl);//将标签加到容器中
        setVisible(true);//使得窗体可见
        //设置窗体关闭方式
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

    }
    public static void main(String[] args){
        //实例化一个SwingAndThread对象

        new SwingAndThread();
    }
}

Runnablej接口运行图


总结

以上就是今天要讲的内容,本文仅仅简单介绍了拓展Threads类和实现Runnable接口,而多线程可以广泛的用在高并发的工业场景中。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值