在java中比较常用的有三种创建多线程的方式。

方式一:继承Thread类,要重写run方法。

在MyThread类

 public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 100 ; i++) {
          //获取线程名称
System.out.println(getName()+":"+i);
}
super.run();
}
}

测试类:

 public class MyThreadDemo {
public static void main(String[] args) {
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
my1.setName("张飞");
my2.setName("关羽"); my1.setDaemon(true);
//开启线程
my1.start();
my2.start();
//设置主线程名称
Thread.currentThread().setName("刘备"); for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}

常用方法:

public final void setDaemon(boolean on):将该线程标记为守护线程或用户线程。
当正在运行的线程都是守护线程时,Java 虚拟机退出。 该方法必须在启动线程前调用

public static void sleep(long millis,int nanos) 在指定的毫秒数内让当前正在执行的线程休眠

public static void yield():暂停当前正在执行的线程对象,并执行其他线程。让多个线程的执行更和谐,但是不能靠它保证一人一次。
public final void join():等待该线程终止。 该线程终止才能执行其他线程

优先级
public final int getPriority():返回线程对象的优先级
public final void setPriority(int newPriority):更改线程的优先级
 线程默认优先级是5。
 程优先级的范围是:1-10。
 线程优先级高仅仅表示线程获取的 CPU时间片的几率高,但是要在次数比较多,或者多次运行的时候才能看到比较好的效果。

这里再提一句:start和run方法有什么区别:run方法就是执行括号里的代码  start方法是首先启动了线程,然后由jvm调用run方法。

方式二:

实现Runnable接口,也要重写run方法。创建Thread对象,将Runnable作为参数传递。

 //测试Runnable
public static void testRunnable(){
//创建Runnable对象
Runnable r = new Runnable() { @Override//run()方法没有返回值,只能通过try抛出异常
public void run() {
System.out.println("当前线程的名字是:"+Thread.currentThread().getName());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO: handle exception
}
}
};
//Thread包装Runnable
Thread t = new Thread(r);
t.start();
}

方式三:

实现Callable接口。在展示Demo之前,说一说实现这个接口需要用到的类和接口。

ExecutorService(线程池):接口,它的超级接口是Executor。

下面这些是返回ExecutorService对象的方法。

* public static ExecutorService newCachedThreadPool()   创建corePoolSize为0,最大线程数为整型的最大数,线程   keepAliveTime为1分钟,缓存任务的队列为SynchronousQueue的线程池。

* public static ExecutorService newFixedThreadPool(int nThread)   创建固定大小的线程池

* public static ExecutorService newSingleThreadExecutor()    创建大小为1的固定线程池

可以执行Runnable对象或者Callable对象代表的线程。

 Future<?> submit(Runnable task)

<T> Future<T> submit(Callable<T> task)

Executors(类):提供了用于此包中所提供的执行程序服务的工厂方法。也就是说可以用它来创建线程池。

Future(接口),API解释:

Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明 Future<?> 形式类型、并返回 null 作为底层任务的结果。说白了就是获取Callable返回值的对象。

FutureTask(类):它实现的接口:Runnable Future<V> RunnableFuture<V>。

构造方法:

FutureTask(Callable<V> callable)

创建一个 FutureTask,一旦运行就执行给定的 Callable。

FutureTask(Runnable runnable, V result)

创建一个 FutureTask,一旦运行就执行给定的 Runnable,并安排成功完成时 get 返回给定的结果 。

 //测试Callable,可以通过throws抛出异常
public static void testCallable() throws InterruptedException, ExecutionException{
//创建对象
Callable<Student> c = new Callable<Test.Student>() { @Override
//call()方法可以有返回值,并且可以通过throws抛出异常
public Student call() throws Exception {
System.out.println("当前线程的名称是:"+Thread.currentThread().getName());
Thread.sleep(2000);
return new Student("张飞", 30);
}
};
//包装对象 第一种方法
FutureTask<Student> ft = new FutureTask<Student>(c); try {
//执行线程
new Thread(ft).start();
//获取结果
System.out.println(ft.get().getName()+ft.get().getAge());
} catch (Exception e) {
e.printStackTrace();
} //第二种方法
//创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。
ExecutorService es = Executors.newSingleThreadExecutor();
//Executors Executor ExecutorService
Future<Student> f = es.submit(new Callable<Student>() { @Override
public Student call() throws Exception { return new Student("关羽", 33);
}
});
System.out.println(f.get().getName() + f.get().getAge()); }





java中创建多线程的方式的更多相关文章

  1. java中创建线程的方式

    创建线程的方式: 继承thread 实现runnable 线程池 FurureTask/Callable 第一种:继承thread demo1: public class demo1 { public ...

  2. java中创建多线程两种方式以及实现接口的优点

    多线程创建方式有两种 创建线程的第一种方式.继承Thread类 1.继承Thread类 2.重写Thread类中的run方法--目的将自定义代码存储在run方法.让线程执行3.调用线程的start() ...

  3. JAVA中创建线程的三种方法及比较

    JAVA中创建线程的方式有三种,各有优缺点,具体如下: 一.继承Thread类来创建线程 1.创建一个任务类,继承Thread线程类,因为Thread类已经实现了Runnable接口,然后重写run( ...

  4. Java中实现线程的方式

    Java中实现线程的方式 Java中实现多线程的方式的方式中最核心的就是 run()方法,不管何种方式其最终都是通过run()来运行. Java刚发布时也就是JDK 1.0版本提供了两种实现方式,一个 ...

  5. Java中创建线程的三种方式以及区别

    在java中如果要创建线程的话,一般有3种方法: 继承Thread类: 实现Runnable接口: 使用Callable和Future创建线程. 1. 继承Thread类 继承Thread类的话,必须 ...

  6. java 中创建线程有哪几种方式?

    Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行 ...

  7. Java中创建实例化对象的几种方式

    Java中创建实例化对象有哪些方式? ①最常见的创建对象方法,使用new语句创建一个对象.②通过工厂方法返回对象,例:String s =String.valueOf().(工厂方法涉及到框架)③动用 ...

  8. Java中创建(实例化)对象的五种方式

    Java中创建(实例化)对象的五种方式1.用new语句创建对象,这是最常见的创建对象的方法. 2.通过工厂方法返回对象,如:String str = String.valueOf(23); 3.运用反 ...

  9. 总结java中创建并写文件的5种方式

    在java中有很多的方法可以创建文件写文件,你是否真的认真的总结过?下面笔者就帮大家总结一下java中创建文件的五种方法. Files.newBufferedWriter(Java 8) Files. ...

随机推荐

  1. CSS3秘笈:第三章

    1.标签选择器:控制整体. 使用标签选择器,只需要输入标签的名称即可. 2.类选择器:精确控制. 假如你要指定一些相同的元素拥有不同的样式,可以给元素添加不同的类名,然后用类选择器来应用对应的样式. ...

  2. POJ 2387 Til the Cows Come Home(dij+邻接矩阵)

    ( ̄▽ ̄)" //dijkstra算法: //这题建邻接矩阵的时候有坑(先读入边后读入点),还有重边: #include<iostream> #include<cstdio ...

  3. windows 装 centos

    windows下压缩一下空间 直接装centos 找到分配给linux的/boot目录,然后修改grub/menu.lst文件,更换一下位置即可

  4. 如何使用 AngularJS 的 ngShow 和 ngHide

    今天我们来看看怎样使用Angular的ngShow 和ngHide 指令来完成它们听起来应该完成的,显示和隐藏! 它们应该做的事 ngShow 和ngHide 允许我们显示或隐藏不同的元素.这有助于创 ...

  5. centos6.5中gitlab的搭建

    使用gitlab官网给的源码进行安装,步骤如下: Install a GitLab CE Omnibus package on CentOS 6 (and RedHat/Oracle/Scientif ...

  6. .htaccess文件url重写小记

    .htaccess文件url重写 当上一条规则匹配 并转换后 符合下一条规则的 继续下一条的匹配转换 RewriteRule ^shangpin-([0-9a-zA-Z]+)/category-([0 ...

  7. 【Valse首发】CNN的近期进展与实用技巧(上)

    作者:程程链接:https://zhuanlan.zhihu.com/p/21432547来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 深度学习大讲堂致力于推送人工智 ...

  8. sql中 replace函数

    例用 xxx 替换 abcdefghi 中的字符串 cde. SELECT REPLACE(''abcdefghicde'',''cde'',''xxx'')

  9. RS232 DB9 公头 母头 串口引脚定义

    转自:http://hi.baidu.com/zhy_myspace/item/ad1ab0f112a4da1ad7ff8cf9 DB9 公头 母头 串口引脚定义 1.RS-232端(DB9母头/孔型 ...

  10. SVN-svn path not found: 404 Not Found

    报错信息是本地找不到文件 因为我直接移动了项目中的java文件到别的目录,在SVN看来相当于变相的删掉了一个目录的文件,在另外一个目录新增文件, 但是移动文件SVN是不会做删除记录到日志文件中的,所以 ...