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) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度 ...
随机推荐
- phpcms v9文章页调用点击量方法
1.在页面加载" 2.调用统计点击的标签:: 3.最后,在写上这一句:" phpcms v9增加文章随机点击数的方法 找到文件count.php(网站根目录/api) 查找第50行 ...
- Unity UGUI —— 无限循环List
还记得大学毕业刚工作的时候是做flash的开发,那时候看到别人写的各种各样的UI组件就非常佩服,后来自己也慢慢尝试着写,发现其实也就那么回事.UI的开发其实技术的成分相对来说不算多,但是一个好的UI是 ...
- 兼容IE6及以上的导航栏子菜单栏滑过显示隐藏效果
;(function(window){ var li = document.getElementById('parentnav').getElementsByTagName('li')[ ...
- Struts框架中struts-config.xml文件配置小结
弄清楚struts-config.xml中各项元素的作用,对于我们构建web项目有莫大的好处.<struts-config>是struts的根元素,它主要有8个子元素,DTD定义 如下: ...
- 通过RMAN克隆11g数据库(基于active database)
11g的RMAN duplicate 可以通过Active databaseduplicate和Backup-based duplicate两种方法实现.这里的测试使用的是Active databas ...
- JS之ONLoad事件
如果我问你window.load和window.onload分别是什么意思,恐怕你会回答我:“这不是页面加载完就执行吗”. 但是答案是不一定,得看你怎么用.看一下例子吧 例1: <!DOCTYP ...
- Firebug及YSlow简介与使用图文详解
Firebug本是Firefox浏览器下一个出色的网页设计插件,随着浏览器的发展,Firebug也推出了支持IE.Opera.Chrome的Firebug Lite.凭借Firebug的出色代码调试功 ...
- Atom 编辑器系列视频课程
此课程为 Atom 编辑器系列课程,主要介绍了 Atom 的高效开发技巧以及必备插件. 课程列表 Atom编辑器系列课程 #1 - Atom简介 Atom编辑器系列课程 #2 - 设置简介 Atom编 ...
- 大咖,我能转行做UX设计师吗?
前几天,有个朋友找到我,叫我给分析下他适不适合转UX设计.他的专业是建筑设计,之所以要辞职,也就是公司破事多,老板又不看重他.看到UX设计这个行业的前景很不错,想要转行.他说的也没错, 现在的UX设计 ...
- 抽象类 abstract 和 接口 interface 类的区别
在看一些框架的优秀改良时,都会设计一层base层,并且 base里面一般都是 abstract 类,然后 就找了为什么做的原因.发现: PHP5支持抽象类和抽象方法.抽象类不能直接被实例化,你必须先继 ...