关键词:
Java 线程类也是一个 object 类,它的实例都继承自 java.lang.Thread 或其子类。 可以用如下方式用 java 中创建一个线程,执行该线程可以调用该线程的 start()方法:
Tread thread = new Thread(); thread.start();
在上面的例子中,我们并没有为线程编写运行代码,因此调用该方法后线程就终止了。
编写线程运行时执行的代码有两种方式:一种是创建 Thread 子类的一个实例并重写 run 方法,第二种是创建类的时候实现 Runnable 接口。接下来我们会具体讲解这两种方法:
创建 Thread 的子类
创建 Thread 子类的一个实例并重写 run 方法,run 方法会在调用 start()方法之后被执行。可以用如下方式创建并运行上述 Thread 子类例子如下:
public class MyThread extends Thread { public void run(){ System.out.println("MyThread running"); } } MyThread myThread = new MyThread(); myTread.start();
一旦线程启动后 start 方法就会立即返回,而不会等待到 run 方法执行完毕才返回。就好像 run 方法是在另外一个 cpu 上执行一样。当 run 方法执行后,将会打印出字符串 MyThread running。
你也可以如下创建一个 Thread 的匿名子类:
Thread thread = new Thread(){ public void run(){ System.out.println("Thread Running"); } }; thread.start();
当新的线程的 run 方法执行以后,计算机将会打印出字符串”Thread Running”。
实现 Runnable 接口
第二种编写线程执行代码的方式是新建一个实现了 java.lang.Runnable 接口的类的实例,实例中的方法可以被线程调用。下面给出例子:
public class MyRunnable implements Runnable { public void run(){ System.out.println("MyRunnable running"); } }
为了使线程能够执行 run()方法,需要在 Thread 类的构造函数中传入 MyRunnable 的实例对象。示例如下:
Thread thread = new Thread(new MyRunnable()); thread.start();
当线程运行时,它将会调用实现了 Runnable 接口的 run 方法。上例中将会打印出”MyRunnable running”。
同样,也可以创建一个实现了 Runnable 接口的匿名类,如下所示:
Runnable myRunnable = new Runnable(){ public void run(){ System.out.println("Runnable running"); } } Thread thread = new Thread(myRunnable); thread.start();
创建子类还是实现 Runnable 接口?
对于这两种方式哪种好并没有一个确定的答案,它们都能满足要求。就我个人意见,我更倾向于实现 Runnable 接口这种方法。因为线程池可以有效的管理实现了 Runnable 接口的线程,如果线程池满了,新的线程就会排队等候执行,直到线程池空闲出来为止。而如果线程是通过实现 Thread 子类实现的,这将会复杂一些。
有时我们要同时融合实现 Runnable 接口和 Thread 子类两种方式。例如,实现了 Thread 子类的实例可以执行多个实现了 Runnable 接口的线程。一个典型的应用就是线程池。
常见错误:调用 run()方法而非 start()方法
创建并运行一个线程所犯的常见错误是调用线程的 run()方法而非 start()方法,如下所示:
Thread newThread = new Thread(MyRunnable()); newThread.run(); //should be start();
起初你并不会感觉到有什么不妥,因为 run()方法的确如你所愿的被调用了。但是,事实上,run()方法并非是由刚创建的新线程所执行的,而是被创建新线程的当前线程所执行了。也就是被执行上面两行代码的线程所执行的。想要让创建的新线程执行 run()方法,必须调用新线程的 start 方法。
线程名
当创建一个线程的时候,可以给线程起一个名字。它有助于我们区分不同的线程。例如:如果有多个线程写入 System.out,我们就能够通过线程名容易的找出是哪个线程正在输出。例子如下:
MyRunnable runnable = new MyRunnable(); Thread thread = new Thread(runnable, "New Thread"); thread.start(); System.out.println(thread.getName());
需要注意的是,因为 MyRunnable 并非 Thread 的子类,所以 MyRunnable 类并没有 getName()方法。可以通过以下方式得到当前线程的引用:
Thread.currentThread();
String threadName = Thread.currentThread().getName();
线程代码举例:
这里是一个小小的例子。首先输出执行main()方法线程名字。这个线程 JVM 分配的。然后开启 10 个线程,命名为 1~10。每个线程输出自己的名字后就退出。
public class ThreadExample { public static void main(String[] args){ System.out.println(Thread.currentThread().getName()); for(int i=0; i<10; i++){ new Thread("" + i){ public void run(){ System.out.println("Thread: " + getName() + "running"); } }.start(); } } }
需要注意的是,尽管启动线程的顺序是有序的,但是执行的顺序并非是有序的。也就是说,1 号线程并不一定是第一个将自己名字输出到控制台的线程。这是因为线程是并行执行而非顺序的。Jvm 和操作系统一起决定了线程的执行顺序,他和线程的启动顺序并非一定是一致的。
java多线程的创建
前言:虽然java的API中说创建多线程的方式只有两种(Therearetwowaystocreateanewthreadofexecution),分别是继承Thread类创建和实现Runnable接口创建,在上一篇博文中演示了这两种,详见,但是JDK5.0以后新增了两种,分别是实现Callable接口... 查看详情
java-多线程创建
Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类。可以用如下方式用java中创建一个线程,执行该线程可以调用该线程的start()方法:Treadthread=newThread();thread.start();在上面的例子中,我们并没有为线程编写运行代码... 查看详情
java线程教程:使用java创建线程和多线程(代码片段)
与许多其他计算机语言不同,Java提供了对多线程的内置支持。Java中的多线程包含两个或多个可以同时运行的部分。Java线程实际上是一个轻量级进程。本文将介绍许多人发现棘手或难以理解的JavaThread概念。 我将讨论以下主... 查看详情
java多线程-五种线程创建方式
简单使用示例Java提供了三种创建线程的方法:通过实现Runnable接口;通过继承Thread类本身;通过Callable和Future创建线程。还有定时器线程池下面第一个类给出了四种创建方式,第二个类是定时器示例。①publicclassThreadStartTest{publics... 查看详情
《java多线程——线程简介与其创建》
Java给多线程编程提供了内置的支持。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。这里定... 查看详情
java多线程
JAVA多线程1.使用Runnable接口方式创建线程2.使用匿名类方式创建线程3.线程常用api4.守护线程与非守护线程5.线程几种状态6.join方法介绍 1.使用Runnable接口方式创建线程代码1.1实现Runnablerun方法classCreateThreadDemo02implementsRunnable... 查看详情
java多线程01(thread类线程创建线程池)
Java多线程(Thread类、线程创建、线程池)第一章多线程1.1多线程介绍1.1.1基本概念进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。... 查看详情
java多线程入门
JAVA多线程概述为什么使用多线程进程之间不能共享内存,但线程之间共享内存很容易系统创建进程需要为该进程重新分配系统资源,但创建线程代价小得多,因此使用多线程来实现多任务并发比多进程的效率高JAVA内置了多线程... 查看详情
java入门-高级教程-07.多线程
.../training/java-multi-threading.html更多教程:光束云-免费课程多线程序号文内章节视频1概述-2一个线程的生命周期-3线程的优先级-4创建一个线程-5通过实现Runnable接口来创建线程-6通过继承Thread来创建线程-7通过继承Thread来创建线程-8通... 查看详情
java如何创建多线程服务器?
在Java编程中,如何创建多线程服务器?以下示例演示如何使用ServerSocket类的MultiThreadServer(socketname)方法和Socket类的ssock.accept()方法来创建多线程服务器。packagecom.yiibai;importjava.io.IOException;importjava.io.PrintStream;importjava.net.Serve 查看详情
java多线程-----匿名内部类创建线程
1.继承Thread类创建线程packagecom.practise.createthread;publicclassAnonymousThread{publicstaticvoidmain(String[]args){newThread("线程一"){publicvoidrun(){for(inti=1;i<=20;i++){System.out.println(T 查看详情
多线程 - 在创建新线程之前等待子线程 - Java
】多线程-在创建新线程之前等待子线程-Java【英文标题】:Multithreading-Waitforsubthreadsbeforecreatinganewthread-Java【发布时间】:2016-08-0411:57:51【问题描述】:我正在创建“大线程”,让我们将它们命名为A、B、C...并将它们放入队列中... 查看详情
java学习-多线程的创建
多线程查找文件内容遍历所有文件,当遍历到文件名是.java结尾的时候,创建一个线程去查找这个文件的内容(是否包含“Magic”字符串),不必等待这个线程结束,继续遍历下一个文件。1packagemultiplethread;23importjava.io.Buffer... 查看详情
java-多线程-创建线程的三种方式
JAVA-多线程-创建线程的三种方式并发:同一时间只有一条指令在执行,多个进程的指令被快速轮换执行。并行:同一时间有多条指令在多个处理器上运行。进程:每个运行中的程序就是一个进程。线程:线程(Thread)也被称为轻... 查看详情
java多线程入门
为什么使用多线程进程之间不能共享内存,但线程之间共享内存很容易系统创建进程需要为该进程重新分配系统资源,但创建线程代价小得多,因此使用多线程来实现多任务并发比多进程的效率高JAVA内置了多线程... 查看详情
第五周作业(java多线程创建的三个方法)
我最近在学习Java中多线程,并且觉得多线程这块在以后的Java开发中显得极为重要,就谈一下Java实现多线程的三种方式。JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实... 查看详情
java多线程的创建方法
Java 线程类也是一个 object 类,它的实例都继承自java.lang.Thread 或其子类。 可以用如下方式用 java 中创建一个线程,执行该线程可以调用该线程的 start()方法: Treadthread=newThread();thread.start(); ... 查看详情
java多线程多线程基础
1.创建线程的方法之一--继承Thread类,并实现run方法1.main函数 2.测试线程类:3.运行结果: 2.创建线程的方法之二--实现Runnable接口 查看详情