`
bcyy
  • 浏览: 1809721 次
文章分类
社区版块
存档分类
最新评论

Java——创建线程程序

 
阅读更多

创建线程程序

Java语句的一个复杂特性是,能够使用线程编写具有多任务功能的程序,Java的该功能是通过称为线程的对象类实现的。

1、线程

线程是一种组织程序的方式,使其能够同时做多项工作。需要同时执行的每项任务都运行在自己的线程中,这通常是通过将每项任务作为独立的类来实现的。

线程用Thread类和Runnable接口表示,它的一种最简单的用途是降低程序完成工作的速度。

1)、创建线程

可作为线程运行的Java类常被称为“线程化类”。如果将耗时的任务放在独立的线程中,程序的其他部分运行起来将更快,这通常用于防止任务降低程序的图形用户界面的响应速度。

例如编写了一个从磁盘加载股价数据并生成统计数据的程序,最耗时的任务是从磁盘加载数据。如果不在应用程序中使用线程,加载数据时程序的界面响应将很慢。这可能让用户失去耐心。

有两种方法可将任务放在线程中:

>将任务放在实现了Runnable接口的类中;

>将任务放在Thread的子类中;

当实现了Runnable接口后,其类必须包含run()方法,因为run()方法应完成线程要完成的任务。

当线程应用程序运行时,不会自动执行run()方法中的语句。在Java中可以启动和终止线程,要运行线程,必须做下面两项工作:

>通过调用构造函数Thread创建线程化类的对象;

>通过调用start()方法启动线程;

>通过thread = null来终止线程;

构造函数Thread接受一个参数——包含线程的run()方法的对象。通常使用this作为参数,this表明当前类包含的run()方法。

下面来看一个例子:

package javaapplication1;

 

import java.awt.BorderLayout;

import java.awt.HeadlessException;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import javax.swing.JTextField;

 

public class test01 extends JFrame implements Runnable , ActionListener{

 

    Thread go;

    JLabel howManyLabel;

    JTextField howMany;

    JButton display;

    JTextArea primes;

 

    public test01() throws HeadlessException {

        super("寻找素数");

        setSize(400 , 300);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        BorderLayout bord = new BorderLayout();

        setLayout(bord);

        

        howManyLabel = new JLabel("数量:");

        howMany = new JTextField("400" , 10);

        display = new JButton("显示素数");

        primes = new JTextArea(8 , 40);

        

        display.addActionListener(this);

        JPanel topPanel = new JPanel();

        topPanel.add(howManyLabel);

        topPanel.add(howMany);

        topPanel.add(display);

        add(topPanel , BorderLayout.NORTH);

        

        primes.setLineWrap(true);

        JScrollPane textPane = new JScrollPane(primes);

        add(textPane , BorderLayout.CENTER);

        

        setVisible(true);

    }

 

    @Override

    public void run() {

        int quantity = Integer.parseInt(howMany.getText());

        int numPrimes = 0;

        //最小素数

        int candidate = 2;

        primes.append("Fisrt:" + quantity + " primes:");

        while (numPrimes < quantity) {            

            if (IsPrime(candidate)) {

                primes.append(candidate + "  ");

                numPrimes++;

            }

            candidate++;

        }

    }

    

    public static boolean IsPrime(int checkNumber)

    {

        double root = Math.sqrt(checkNumber);

        for (int i = 2; i < root; i++) {

            if (checkNumber % i == 0) {

                return false;

            }

        }

        return true;

    }

 

    @Override

    public void actionPerformed(ActionEvent e) {

        display.setEnabled(false);

        if (go == null) {

            go = new Thread(this);

            go.start();

        }

    }

    

    public static void main(String[] args)

    {

        test01 test = new test01();

    }

}


此例子计算400以内的素数并在文本框中列出,显示结果如图:

2、创建线程

下面的例子是创建一个能够在网页中运行的多线程应用程序,在程序中你将学会如何开启和终止线程,以及如何使用代码打开浏览器。

test01.java:

import java.applet.AppletContext;

import java.awt.Button;

import java.awt.Color;

import java.awt.FlowLayout;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.net.URL;

import javax.swing.JApplet;

 

public class test01 extends JApplet implements Runnable , ActionListener{

 

    String[] pageTitle = new String[6];

    URL[] PageLink = new URL[6];

    Color butterscotch = new Color(255 , 204, 158);

    int current = 0;

    Thread runner;

 

    @Override

    public void init() {

        pageTitle = new String[]{

            "百度" , 

            "搜狐" , 

            "谷歌" , 

            "网易" , 

            "腾讯" ,

            "淘宝"};

        PageLink[0] = getURL("http://www.baidu.com");

        PageLink[1] = getURL("http://www.sohu.com/");

        PageLink[2] = getURL("http://www.google.com");

        PageLink[3] = getURL("http://www.163.com");

        PageLink[4] = getURL("http://www.qq.com");

        PageLink[5] = getURL("http://www.taobao.com");

        Button goButton = new Button("Go");

        goButton.addActionListener(this);

        FlowLayout flow = new FlowLayout();

        setLayout(flow);

        add(goButton);

    }

    

    URL getURL(String urlText)

    {

        URL pageURL = null;

        try {

            pageURL = new URL(getDocumentBase() , urlText);

        } catch (Exception e) {

            e.printStackTrace();

        }

        return pageURL;

    }

 

    @Override

    public void paint(Graphics g) {

        Graphics2D g2D = (Graphics2D)g;

        g2D.setColor(butterscotch);

        g2D.fillRect(0, 0, getSize().width, getSize().height);

        g2D.setColor(Color.black);

        g2D.drawString(pageTitle[current], 5, 60);

        g2D.drawString("" + PageLink[current], 5, 80);

    }

 

    @Override

    public void start() {

        if (runner == null) {

            runner = new Thread(this);

            runner.start();

        }

    }

    

    @Override

    public void run() {

        Thread thisThread = Thread.currentThread();

        while (runner == thisThread) {            

            current++;

            if (current > 5) {

                current = 0;

            }

            repaint();

            try {

                Thread.sleep(10000);

            } catch (Exception e) {

                e.printStackTrace();

            }

            

        }

    }

 

    @Override

    public void stop() {

        if (runner != null) {

            runner = null;

        }

    }

 

    @Override

    public void actionPerformed(ActionEvent e) {

        if (runner != null) {

            runner = null;

        }

        AppletContext browser = getAppletContext();

        if (PageLink[current] != null) {

            browser.showDocument(PageLink[current]);

        }

    }

}


WeightScale.html:

<applet code="test01.class" codebase="..\\..\\build\\classes"

        height="100" width="300">

    <param name="person" value="konishiki"/>

    <param name="weight" value="605"/>

</applet>

效果图如下:

分享到:
评论

相关推荐

    多线程

    3. 测试一个Applet小应用程序,体会多线程程序的运行过程; 三、实验步骤 1. 按照要求编写第1题中的代码,并将其编译、运行。 1) 由于第一个线程和第二个线程的功能相同,因此只需要定义2个线程——字母打印线程、...

    java-多线程下载器(支持断点续传、线程加减)包含源码和可运行jar包

    5、点击菜单栏“任务——退出程序”正常退出,可以保存当前未下载完成的任务,等待下次继续下载(建议先暂停所有任务再退出程序,以免丢失信息!); 6、点击“打开”可以查看之前未下载完成的任务,继续下载; 7...

    Java语言程序设计

    不但详细介绍了Java语言本身,而且讨论了面向对象的设计思想和编程方法、UML建模语言、图形用户界面的编程方法、网络和数据库程序的编程方法、线程的使用、Java集合框架等实用开发技术。全书以面向对象的程序设计...

    Java语言程序设计的课程设计项目——利用Java实现地球系动画完整实现实例(第2部分).pdf

    精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究, 1/13 页 1 1.1 利用 Java 实现地球系动画完整实现实例(第 2 部分) 1.1.1 利用 MyEclipse 等工具开发 Java 程序 ——(主要的目标...

    基于某JAVA地剪刀石头布游戏设计——Java课程设计报告材料-.doc

    通常有 两种方法来创建线程:其一,使用型构为Thread(Runnable) 的构造子将一个实现了Runnable接口的对象包装成一个线程,其二,从Thread类派生出 子类并重写run方法,使用该子类创建的对象即为线程。值得注意的是...

    java源码包---java 源码 大量 实例

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...

    多线程操作实例源码

     多线程的好处在于可以提高CPU的利用率——任何一个程序员都不希望自己的程序很多时候没事可干,在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。...

    多线程操作实例源码,,

     多线程的好处在于可以提高CPU的利用率——任何一个程序员都不希望自己的程序很多时候没事可干,在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。...

    深入浅出设计模式(中文版电子版)

    5.5.4Java实例——多线程通信 220 5.5.5优势和缺陷 223 5.5.6应用情景 223 5.6MementoPattern(备忘录模式) 223 5.6.1定义 223 5.6.2现实示例——音响均衡器 226 5.6.3C#实例——销售目标 226 5.6.4Java实例...

    深入浅出设计模式(中文版)

    5.5.4Java实例——多线程通信 220 5.5.5优势和缺陷 223 5.5.6应用情景 223 5.6MementoPattern(备忘录模式) 223 5.6.1定义 223 5.6.2现实示例——音响均衡器 226 5.6.3C#实例——销售目标 226 5.6.4Java实例...

    计算机网络课程设计 多线程端口扫描器(TCP/UDP端口扫描)(java实现)带GUI界面

    2.2端口的有效范围是1~65535,在该范围内使用多线程机制循环创建客户端套接字对象,对某一地址(段)的主机端口进行扫描,若套接字没有发生异常,说明该端口打开并提供服务,返回该开放端口的类型(如UDP端口还是TCP...

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    学通Java的24堂课

    2.9.3 基本功训练3——创建用户自定义类库 47 2.9.4 基本功训练4——为项目添加类库 48 2.9.5 基本功训练5——为项目添加类文件夹 49 2.10 情景应用——拓展与实践 50 2.10.1 情景应用1——为窗体添加文本框控件...

    java源码包4

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java源码包3

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java源码包2

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    第1章 让自己的第一个Java程序跑起来 2 教学视频:19分钟 1.1 想要用Java改变这个世界吗? 2 1.1.1 Java有什么优势? 2 1.1.2 Java在哪儿? 3 1.2 准备好开始Java之旅 3 1.2.1 下载JDK 4 1.2.2 安装JDK 5 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    第1章 让自己的第一个Java程序跑起来 2 教学视频:19分钟 1.1 想要用Java改变这个世界吗? 2 1.1.1 Java有什么优势? 2 1.1.2 Java在哪儿? 3 1.2 准备好开始Java之旅 3 1.2.1 下载JDK 4 1.2.2 安装JDK 5 ...

    Java典型模块

    4.4.2 多线程程序的编写方式 4.5 小结 第5章 模拟做饭场景(线程的join()方法) 教学视频:7分钟5.1 做饭场景原理 5.1.1 项目结构框架分析 5.1.2 项目功能业务分析 5.2 纷乱的做饭场景 5.2.1 儿子的类 5.2.2 妈妈...

Global site tag (gtag.js) - Google Analytics