java 创建线程

java创建线程有3种方式:

(1)继承Thread
(2)实现Runnable接口
(3)实现Callable接口

1、继承Thead

  1. package com.java.thread;
  2. public class ThreadClient {
  3. public static void main(String[] args) {
  4. Print p1 = new Print();
  5. Print p2 = new Print();
  6. p1.start();
  7. p2.start();
  8. }
  9. }
  10. class Print extends Thread{
  11. @Override
  12. public void run(){
  13. for(int i=0;i<10;i++){
  14. System.out.println(Thread.currentThread().getName()+":"+i);
  15. try {
  16. Thread.sleep(2000);
  17. } catch (InterruptedException e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. }
  22. }

2、实现Runnable接口

  1. package com.java.thread;
  2. public class ThreadClient1 {
  3. public static void main(String[] args) {
  4. Runnable p1 = new Salesman("Jack");
  5. Runnable p2 = new Salesman("Iris");
  6. Thread t1 = new Thread(p1);
  7. Thread t2 = new Thread(p2);
  8. t1.start();
  9. t2.start();
  10. }
  11. }
  12. class Salesman implements Runnable{
  13. private int ticket=100;
  14. private String name;
  15. Salesman(String name){
  16. this.name=name;
  17. }
  18. @Override
  19. public void run(){
  20. while(ticket>0){
  21. System.out.println(ticket--+" is saled by "+name+","+Thread.currentThread().getName());
  22. try {
  23. Thread.sleep(1000);
  24. } catch (InterruptedException e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. }
  29. }

3、实现Callable接口

  1. package com.java.thread;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.concurrent.Callable;
  5. import java.util.concurrent.ExecutionException;
  6. import java.util.concurrent.ExecutorService;
  7. import java.util.concurrent.Executors;
  8. import java.util.concurrent.Future;
  9. public class CallType {
  10. public static void main(String[] args) {
  11. ExecutorService es = Executors.newCachedThreadPool();
  12. List<Future<String>> results = new ArrayList<Future<String>>();
  13. for(int i=0;i<5;i++){
  14. results.add(es.submit(new TaskWithResult(i)));
  15. }
  16. for(Future<String> fs : results){
  17. try {
  18. System.out.println(fs.get());
  19. } catch (InterruptedException | ExecutionException e) {
  20. // TODO Auto-generated catch block
  21. e.printStackTrace();
  22. }
  23. }
  24. }
  25. }
  26. class TaskWithResult implements Callable<String>{
  27. private int id;
  28. public TaskWithResult(int id){
  29. this.id = id;
  30. }
  31. @Override
  32. public String call() throws Exception {
  33. return "result of TaskWithResult" + id;
  34. }
  35. }

由于Java只支持单继承,所以用继承的方式创建线程,比较死板,不够灵活;用实现接口的方式创建线程,可以实现多个接口,比较灵活。
Runnable和Callable接口的区别:
(1)Callable重写的方法是call(),Runnable重写的方法是run()。
(2)Callable的任务执行后可返回值,而Runnable不能返回值。
(3)call方法可以抛出异常,run()不可以。

时间: 2024-10-24 00:28:34

java 创建线程的相关文章

Java创建线程的三种主要方式

Java创建线程的主要方式 一.继承Thread类创建 通过继承Thread并且重写其run(),run方法中即线程执行任务.创建后的子类通过调用 start() 方法即可执行线程方法. 通过继承Thread实现的线程类,多个线程间无法共享线程类的实例变量.(需要创建不同Thread对象,自然不共享) 例子: /** * 通过继承Thread实现线程 */ public class ThreadTest extends Thread{ private int i = 0 ; @Override

(转)java创建线程的两种方法比较

Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法:  ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢? 在Java中,类仅支持单继承

java创建线程的三种方式及其对比

Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实例,即创建了线程对象. (3)调用线程对象的start()方法来启动该线程. package com.thread; public class FirstThreadTest extends Thread{ int i = 0; //重写run方法,run方法的方

Java创建线程的细节分析

转载:http://shmilyaw-hotmail-com.iteye.com/blog/1880902 前言 关于线程创建的问题,可以说是老生常谈了.在刚开始学习Thread的时候基本上都会接触到,用简单的一两句话就可以概括起来.一个是创建类实现Runnable接口,然后将该类的实例作为参数传入到Thread构造函数中.再调用Thread对象的start方法.还有一种是继承Thread类,覆写run方法.然后在该对象实例中调用start方法.那么,这两种方式在什么情况下适用呢?还有,既然我们

Java创建线程的两个方法

Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法: ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢? 在Java中,类仅支持单继承,

Java 创建线程的两种方法

Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法: ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢? 在Java中,类仅支持单继承,

java创建线程的三种方式及其对照

Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类.并重写该类的run方法,该run方法的方法体就代表了线程要完毕的任务.因此把run()方法称为运行体. (2)创建Thread子类的实例,即创建了线程对象. (3)调用线程对象的start()方法来启动该线程. package com.thread; public class FirstThreadTest extends Thread{ int i = 0; //重写run方法.run方法的方

Java创建线程的两种方法

大多数情况,通过实例化一个Thread对象来创建一个线程.Java定义了两种方式: 实现Runnable 接口: 可以继承Thread类. 下面的两小节依次介绍了每一种方式. 实现Runnable接口 创建线程的最简单的方法就是创建一个实现Runnable 接口的类.Runnable抽象了一个执行代码单元.你可以通过实现Runnable接口的方法创建每一个对象的线程.为实现Runnable 接口,一个类仅需实现一个run()的简单方法,该方法声明如下:    public void run( )

java创建线程两种方法

/* 进程:是一个正在执行中的程序 每一个进程执行都有执行顺序,该顺序是一个执行路径,或叫控制单元 线程:就是进程中一个独立的控制单元 线程在控制着进程的执行 一个进程至少包含一个线程 Java VM 启动时会有个进程java.exe 该进程中至少有一个线程复制java程序的执行,这个线程运行的代码存在于main方法中, 该线程称之为主线程 JVM启动不止一个线程,还有复制垃圾回收机制的线程 创建线程:(1)继承Thread类;复写run方法;创建对象,调用start方法 (2)实现Runnab