java线程学习(一)
1.简介
java基础知识部分线程创建的三种方式、线程执行的样例。
代码地址:http://git.oschina.net/blue_phantom/javaj
包位置:package com.bluej.javaj.thread.first;
2.创建线程
继承Thread类、实现Runnale接口、实现Callable接口。
/**
* 创建线程方式一
* @author xingdongjie
*
*/
class CreateThread1 extends Thread {
@Override
public void run() {
threadHandle();
} private void threadHandle(){
System.out.println("---通过继承Thread:do what you want---");
}
}
/**
* 创建线程方式二
* @author xingdongjie
*
*/
class CreateThread2 implements Runnable {
@Override
public void run() {
threadHandle();
}
private void threadHandle(){
System.out.println("---通过实现Runnable:do what you want---");
}
}
/**
* 线程创建方式三
* @author xingdongjie
*
*/
class CreateThread3 implements Callable<CallableResult>{
private CallableResult result; @Override
public CallableResult call() throws Exception {
result = new CallableResult();
result.setStart(System.currentTimeMillis()); threadHandle(); result.setEnd(System.currentTimeMillis());
result.setUserTime(result.getEnd()-result.getStart());
result.setMessage("--执行成功--"); return result;
} private void threadHandle(){
try {
Thread.sleep(new Random().nextInt(10) * 1000);
} catch (Exception e) {
}
System.out.println("---通过实现Callable:do what you want---");
}
}
创建线程代码示例
第三种方式实现Callable接口,可以返回执行结果,所以这里创建了一个CallableResult类用做执行结果类。
/**
* callable方式线程执行结果类
* @author xingdongjie
*
*/
class CallableResult implements Serializable{
private static final long serialVersionUID = 1L; private Long start;
private Long end;
private Long userTime;
private String message; public Long getStart() {
return start;
}
public void setStart(Long start) {
this.start = start;
}
public Long getEnd() {
return end;
}
public void setEnd(Long end) {
this.end = end;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
} public Long getUserTime() {
return userTime;
}
public void setUserTime(Long userTime) {
this.userTime = userTime;
}
@Override
public String toString() {
return "CallableResult [start=" + start + ", end=" + end
+ ", userTime=" + userTime + ", message=" + message + "]";
}
CallableResult代码示例
3.执行线程
创建完线程后,启动线程。方式一Thread、方式二Runnale创建的线程后执行方式相同,但是方式三Callable创建的线程执行有些不同。
/**
* 执行线程方式一
*/
public static void doTread1(){
CreateThread1 thread1 = new CreateThread1();
new Thread(thread1).start();
} /**
* 执行线程方式二
*/
public static void doThread2(){
CreateThread2 thread2 = new CreateThread2();
new Thread(thread2).start();
} /**
* 执行线程方式三
*/
public static void doThread3(){
CreateThread3 thread3 = new CreateThread3();
CallableResult result=null;
//可以通过2种方式执行Callable线程
result =chooseOne(thread3);
//result = chooseTwo(thread3);
System.out.println("---线程执行结果result:"+result); }
线程执行代码示例
Callable线程的执行在这里有两种不同的执行方式,所以用了两个方法,使用时可以二选一。
/**
* 通过FutureTask方式执行线程
* @param thread3
* @return
*/
public static CallableResult chooseOne(CreateThread3 thread3){
CallableResult result=null;
FutureTask<CallableResult> future = new FutureTask<CallableResult>(thread3);
new Thread(future).start();
try {
result = future.get();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 通过线程池方式执行线程
* @param thread3
* @return
*/
public static CallableResult chooseTwo(CreateThread3 thread3){
CallableResult result=null;
//创建一种简单的线程池
ExecutorService executorService = Executors.newCachedThreadPool();
Future<CallableResult> future = executorService.submit(thread3);
try {
result = future.get();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
执行Callable线程代码示例
4.小结
以上是线程创建及执行的不同方式。
package com.bluej.javaj.thread.first; import java.io.Serializable;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask; /**
* 线程的创建及执行
* @author xingdongjie
*
*/
public class CreateAndDoThread { /**
* @param args
*/
public static void main(String[] args) {
//3种创建线程的执行demo
//doTread1();
//doThread2();
doThread3(); } /**
* 执行线程方式一
*/
public static void doTread1(){
CreateThread1 thread1 = new CreateThread1();
new Thread(thread1).start();
} /**
* 执行线程方式二
*/
public static void doThread2(){
CreateThread2 thread2 = new CreateThread2();
new Thread(thread2).start();
} /**
* 执行线程方式三
*/
public static void doThread3(){
CreateThread3 thread3 = new CreateThread3();
CallableResult result=null;
//可以通过2种方式执行Callable线程
result =chooseOne(thread3);
//result = chooseTwo(thread3);
System.out.println("---线程执行结果result:"+result); }
/**
* 通过FutureTask方式执行线程
* @param thread3
* @return
*/
public static CallableResult chooseOne(CreateThread3 thread3){
CallableResult result=null;
FutureTask<CallableResult> future = new FutureTask<CallableResult>(thread3);
new Thread(future).start();
try {
result = future.get();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 通过线程池方式执行线程
* @param thread3
* @return
*/
public static CallableResult chooseTwo(CreateThread3 thread3){
CallableResult result=null;
//创建一种简单的线程池
ExecutorService executorService = Executors.newCachedThreadPool();
Future<CallableResult> future = executorService.submit(thread3);
try {
result = future.get();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
} /**
* 创建线程方式一
* @author xingdongjie
*
*/
class CreateThread1 extends Thread {
@Override
public void run() {
threadHandle();
} private void threadHandle(){
System.out.println("---通过继承Thread:do what you want---");
}
}
/**
* 创建线程方式二
* @author xingdongjie
*
*/
class CreateThread2 implements Runnable {
@Override
public void run() {
threadHandle();
}
private void threadHandle(){
System.out.println("---通过实现Runnable:do what you want---");
}
}
/**
* 线程创建方式三
* @author xingdongjie
*
*/
class CreateThread3 implements Callable<CallableResult>{
private CallableResult result; @Override
public CallableResult call() throws Exception {
result = new CallableResult();
result.setStart(System.currentTimeMillis()); threadHandle(); result.setEnd(System.currentTimeMillis());
result.setUserTime(result.getEnd()-result.getStart());
result.setMessage("--执行成功--"); return result;
} private void threadHandle(){
try {
Thread.sleep(new Random().nextInt(10) * 1000);
} catch (Exception e) {
}
System.out.println("---通过实现Callable:do what you want---");
}
}
/**
* callable方式线程执行结果类
* @author xingdongjie
*
*/
class CallableResult implements Serializable{
private static final long serialVersionUID = 1L; private Long start;
private Long end;
private Long userTime;
private String message; public Long getStart() {
return start;
}
public void setStart(Long start) {
this.start = start;
}
public Long getEnd() {
return end;
}
public void setEnd(Long end) {
this.end = end;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
} public Long getUserTime() {
return userTime;
}
public void setUserTime(Long userTime) {
this.userTime = userTime;
}
@Override
public String toString() {
return "CallableResult [start=" + start + ", end=" + end
+ ", userTime=" + userTime + ", message=" + message + "]";
} }
所有代码示例
java线程学习(一)的更多相关文章
- java 线程学习
转载:详见处http://lavasoft.blog.51cto.com/62575/27069 Java多线程编程总结 下面是Java线程系列博文的一个编目: Java线程:概念与原理 ...
- java线程学习——汉堡销售问题
汉堡店中有一个负责做汉堡的厨师,一个负责销售的营业员,用java线程表示他们的营业过程: 问题原型就是生产者与消费者的问题. 首先定义一个汉堡包箱子类与几个相关的变量类: public class H ...
- Java线程学习详解
线程基础 1. 线程的生命周期 1.1 新建状态: 使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态.它保持这个状态直到程序 start() 这个线程. 1 ...
- Java线程学习笔记(两) 线程异常处理
线程捕获异常: 情况下,我们在main()方法里是捕捉不到线程的异常的,比例如以下面代码: public class ExceptionThread implements Runnable{ @Ove ...
- Java线程学习笔记(一个)
一个.正在创建的线程: 老掉牙的话题了.继承 java.lang.Thread父类或者实现Runnalbe接口.这里就提一句: class Thread implements Runnable Thr ...
- 学习java线程学习笔记
线程:代码执行的一个分支 主要作用是提高了效率,cpu能同时执行多个部分的代码. 线程的创建:两种方式 a.继承于thread类,重写run方法. b. ...
- java线程学习之volatile关键字
volatile变量的主要作用:是使变量在多个线程间可见. 在java中每一个线程都会有一块工作内存区,其中存放着所有线程共享的主内存的变量值的拷贝.当线程执行时,它在自己的工作内存区操作这些变量,为 ...
- java线程学习之synchronized关键字
关键字synchronized的作用是实现线程间的同步.它的任务是对同步的代码加锁.一个代码块同时只能有同一个线程进行读和写操作,从而保证线程间是安全的. 线程安全的概念是:当多个线程访问某一个类(对 ...
- java线程学习之Sleep方法
sleep方法是在线程中常用到的一个方法,它是一个静态方法. sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度 ...
随机推荐
- HTML最基础的入门(上)
一.互联网原理 互联网原理:上网即请求数据. 过程:在本机计算机浏览器上输入网址,发送一个http请求到服务器端,服务器会根据协议作出响应,将对应的网页文件通过http协议再传输给我们本地计算机,将网 ...
- NSArray和NSSet的区别
NSSet到底什么类型? 其实它和NSArray功能性质一样,用于存储对象,属于集合: NSSet , NSMutableSet类声明编程接口对象,无序的集合,在内存中存储方式是不连续的 像NSAr ...
- Java线程:条件变量、原子量、线程池等
一.条件变量 条件变量实现了java.util.concurrent.locks.Condition接口,条件变量的实例化就是通过一个Lock对象上调用newCondition()方法获得的,这样条件 ...
- lo dash api
https://lodash.com/docs 用 Lo-Dash 替换 underscore http://segmentfault.com/a/1190000000359484
- C#版--简单工厂模式
为什么要用设计模式? 1.设计模式是前人根据经验总结出来的,使用设计模式,就相当于是站在了前人的肩膀上. 2.设计模式使程序易读.熟悉设计模式的人应该能够很容易读懂运用设计模式编写的程序. 3.设计模 ...
- java连接ms sql server各类问题解析
首先先来说下使用微软自己开发的架包进行ms sql server数据库的连接时,sql 2000与sql 2005的连接方式略有不同: 1.首先驱动不一样,sql 2000的连接驱动包有三个,分别是: ...
- Spark:使用Spark Shell的两个示例
Spark:使用Spark Shell的两个示例 Python 行数统计 ** 注意: **使用的是Hadoop的HDFS作为持久层,需要先配置Hadoop 命令行代码 # pyspark >& ...
- Unity3d Hololens MR开发入门
一.Hololens概述 Hololens有以下特性 1.空间映射借助微软特殊定制的全息处理单元(HPU),HoloLens 实现了对周边环境的快速扫描和空间匹配.这保证了 HoloLens能够准确地 ...
- 蓝桥网试题 java 基础练习 数列排序
---------------------------------------------------------------------------------------------------- ...
- asp.net权限认证:摘要认证(digest authentication)
asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...