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>

 效果图如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值