线程的实现

  在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;
} }

Java 多线程(二) 线程的实现的更多相关文章

  1. (原创)JAVA多线程二线程池

    一,线程池的介绍 线程池包括一下三种: 线程池名称 创建方法 特点 其他 固定大小线程池 ExecutorService threadpool = Executors.newFixedThreadPo ...

  2. 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)

    Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...

  3. JAVA多线程之线程间的通信方式

    (转发) 收藏 记 周日,北京的天阳光明媚,9月,北京的秋格外肃穆透彻,望望窗外的湛蓝的天,心似透过栏杆,沐浴在这透亮清澈的蓝天里,那朵朵白云如同一朵棉絮,心意畅想....思绪外扬, 鱼和熊掌不可兼得 ...

  4. java 多线程二

    java 多线程一 java 多线程二 java 多线程三 java 多线程四 线程中断: /** * Created by root on 17-9-30. */ public class Test ...

  5. Java多线程之线程的生命周期

    Java多线程之线程的生命周期 一.前言 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态.在线程的生命周期中,它要经过新建(New).就绪(Runnable).运行(R ...

  6. Java多线程之线程协作

    Java多线程之线程协作 一.前言 上一节提到,如果有一个线程正在运行synchronized 方法,那么其他线程就无法再运行这个方法了.这就是简单的互斥处理. 假如我们现在想执行更加精确的控制,而不 ...

  7. Java多线程之线程的互斥处理

    Java多线程之线程的互斥处理 一.前言 多线程程序中的各个线程都是自由运行的,所以它们有时就会同时操作同一个实例.这在某些情况下会引发问题.例如,从银行账户取款时,余额确认部分的代码应该是像下面这样 ...

  8. Java多线程之线程的启动

    Java多线程之线程的启动 一.前言 启动线程的方法有如下两种. 利用Thread 类的子类的实例启动线程 利用Runnable 接口的实现类的实例启动线程 最后再介绍下java.util.concu ...

  9. Java多线程与线程池技术

    一.序言 Java多线程编程线程池被广泛使用,甚至成为了标配. 线程池本质是池化技术的应用,和连接池类似,创建连接与关闭连接属于耗时操作,创建线程与销毁线程也属于重操作,为了提高效率,先提前创建好一批 ...

  10. Java多线程之线程其他类

    Java多线程之线程其他类 实际编码中除了前面讲到的常用的类之外,还有几个其他类也有可能用得到,这里来统一整理一下: 1,Callable接口和Future接口 JDK1.5以后提供了上面这2个接口, ...

随机推荐

  1. mysql-proxy读写分离

    实验环境: LAP+ 1.安装apache服务(192.168.2.131) yum install openssl-devel [root@LAP ~]# tar zxvf httpd-2.2.25 ...

  2. kill 和killall----杀死进程

    1.根据进程ip查看进程名 Liunx中 通过进程名查找进程PID可以通过 pidof  [进程名] 来查找. 反过来 ,通过PID查找进程名则没有相关命令.但在linux根目录中,有一个/proc的 ...

  3. Exception in thread "main" java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

    这个问题当然是找不到mysql的驱动类,可能是环境CLASSPATH有问题或者就是那个人没有加载jdbc的驱动.我在网上下载mysql-connector-java-5.0.8-bin.jar一个这个 ...

  4. jsp隐藏关键 敏感信息,只显示前后字段

    今天写jsp页面,要求对字段中间部分隐藏,只显示前几位和后几位.搜了一下发现网上大都是隐藏前面指定字段,或者是利用正则表达式隐藏手机号或是身份证.这样的话必须预先知道字段长度,而我不想知道长度只显示前 ...

  5. mac监听Dock激活程序

    mac监听Dock激活程序 涉及库添加: LIBS += -framework CoreFoundation -framework Carbon -lobjc 涉及头文件: #include < ...

  6. 剑指OFFER——顺时针打印矩阵

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8 ...

  7. HTML——CSS的基础语法2

    一.盒模型 1-1.什么是盒模型? HTML5盒模型包括:内容(content).填充(padding.也叫做内边距).边框(border).边界(margin,也叫做外边距). 这些属性我们可以用日 ...

  8. Jsp敏感词过滤

    Jsp敏感词过滤 大部分论坛.网站等,为了方便管理,都进行了关于敏感词的设定. 在多数网站,敏感词一般是指带有敏感政治倾向(或反执政党倾向).暴力倾向.不健康色彩的词或不文明语,也有一些网站根据自身实 ...

  9. Silverlight——施工计划日报表(二)

    近来一直在加班,基本上没有个人时间.所以更新不会很即时. 长话短说,先从界面代码开始吧.界面代码很简单,如下所示: <UserControl xmlns:sdk="http://sch ...

  10. 【转载】Linux的inode的理解

    本文转在是博主为了以后温习.请访问原文链接 http://www.cnblogs.com/itech/archive/2012/05/15/2502284.html 一.inode是什么? 理解ino ...