zoukankan      html  css  js  c++  java
  • Java 多线程(二) 线程的实现

    线程的实现

      在Java中通过run方法为线程指明要完成的任务,有两种技术来为线程提供run方法:

      1.继承Thread类并重写它的run方法。之后创建这个子类的对象并调用start()方法。

      2.通过定义实现Runnable接口的类进而实现run方法。这个类的对象在创建Thread的时候作为参数被传入,然后调用start()方法。

      Thread类是专门用来创建线程和对线程进行操作的类。当某个类继承了Thread类之后,该类就叫做一个线程类

      两种方法均需执行线程的start()方法为线程分配必须的系统资源、调度线程运行并执行线程的run()方法。

      start()方法是启动线程的唯一的方法。start()方法首先为线程的执行准备好系统资源,然后再去调用run()方法。一个线程只能启动一次,再次启动就不合法了。

      run()方法中放入了线程的工作,即我们要这个线程去做的所有事情。缺省状况下run()方法什么也不做。

      在具体应用中,采用哪种方法来构造线程要视情况而定。通常,当一个线程已经继承了另一个类时,就应该用第二种方法来构造,即实现Runnable接口。

      下面给出两个例子来说明线程的两种实现方法,每个例子中都有两个线程:

    public class ThreadTest1
    {
        public static void main(String[] args)
        {
            Thread1 thread1 = new Thread1();
            Thread2 thread2 = new Thread2();
    
            thread1.start();
            thread2.start();
        }
    
    }
    
    class Thread1 extends Thread
    {
        @Override
        public void run()
        {
            for (int i = 0; i < 100; ++i)
            {
                System.out.println("Hello World: " + i);
            }
        }
    }
    
    class Thread2 extends Thread
    {
        @Override
        public void run()
        {
    
            for (int i = 0; i < 100; ++i)
            {
                System.out.println("Welcome: " + i);
            }
        }
    }
    -------------------------------------------------------------------------------------
    public class ThreadTest2
    {
        public static void main(String[] args)
        {
            // 线程的另一种实现方法,也可以使用匿名的内部类
            Thread thread1 = new Thread(new MyThread1());
            thread1.start();
    
            Thread thread2 = new Thread(new MyThread2());
            thread2.start();
    
        }
    
    }
    
    class MyThread1 implements Runnable
    {
    
        @Override
        public void run()
        {
            for (int i = 0; i < 100; ++i)
            {
                System.out.println("Hello: " + i);
            }
    
        }
    
    }
    
    class MyThread2 implements Runnable
    {
    
        @Override
        public void run()
        {
            for (int i = 0; i < 100; ++i)
            {
                System.out.println("Welcome: " + i);
            }
    
        }
    }

    Thread类剖析

      Thread类也实现了Runnable接口,因此实现了接口中的run()方法。

      当生成一个线程对象时,如果没有为其指定名字,那么线程对象的名字将使用如下形式:Thread-number,该number是自动增加的数字,并被所有的Thread对象所共享,因为它是一个static的成员变量。

      当使用第一种方式(继承Thread的方式)来生成线程对象时,我们需要重写run()方法,因为Thread类的run()方法此时什么事情也不做。

      当使用第二种方式(实现Runnable接口的方式)来生成线程对象时,我们需要实现Runnable接口的run()方法,然后使用new Thread(new MyRunnableClass())来生成线程对象(MyRunnableClass已经实现了Runnable接口),这时的线程对象的run()方法会调用MyRunnableClass的run()方法。

     

    停止线程

      线程的消亡不能通过调用stop()命令,而是让run()方法自然结束。stop()方法是不安全的,已经废弃。

      停止线程推荐的方式:设定一个标志变量,在run()方法中是一个循环,由该标志变量控制循环是继续执行还是跳出;循环跳出,则线程结束。

      如代码例子中所示:

    public class ControlThreadTest
    {
        MyThreadClass r = new MyThreadClass();
    
        Thread t = new Thread(r);
    
        public void startThread()
        {
            t.start();
        }
    
        public void stopThread()
        {
    
            r.stopRunning();
    
        }
    
    }
    
    class MyThreadClass implements Runnable
    {
        private boolean flag = true;
    
        @Override
        public void run()
        {
            while (flag)
            {
                System.out.println("Do something.");
            }
        }
    
        public void stopRunning()
        {
            flag = false;
        }
    
    }
  • 相关阅读:
    mysql报错:java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.
    MD5登陆密码的生成
    15. 3Sum、16. 3Sum Closest和18. 4Sum
    11. Container With Most Water
    8. String to Integer (atoi)
    6. ZigZag Conversion
    5. Longest Palindromic Substring
    几种非线性激活函数介绍
    AI初探1
    AI初探
  • 原文地址:https://www.cnblogs.com/xuyatao/p/6896376.html
Copyright © 2011-2022 走看看