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) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度 ...
随机推荐
- php5.4下配置zend guard loader
前些日子的时候,zend官网下还没有支持PHP5.4的zend guard loader,今天再上去看的时候居然发现了,看来是我好久不关注它的缘故了... zend guard loader 干什么的 ...
- javascript实现页面滚屏效果
当我们浏览网页的时候,时常会碰到可以滚动屏幕的炫酷网页,今天笔者对这一技术进行简单实现,效果不及读者理想中那般炫酷,主要针对滚屏的技术原理和思想进行分享和分析.本示例在页面右侧有五个数字标签,代表五个 ...
- HDU5832
A water problem Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- ArcGIS三种方式打断相交线------拓扑法
拓扑法:有多个layer图层相交线,选用拓扑法,将多个图层相交线打断. 新建拓扑结构: (1)单击新建"Nfg.gdb"数据库文件: (2)单击新建"XX"集合 ...
- cordova调用本地SQLite数据库的方法
第一篇技术博客,写下来和大家分享今天所学,其次自己也巩固一下. 整个下午的时间用来钻研如何用cordova调用移动端本地SQLite数据库.首先我并不是用eclipse来编程的,而是用cordova建 ...
- runloop和runtime
runloop Runloop是事件接收和分发机制的一个实现. 一个程序从main函数开始,函数执行完毕之后就会退出,iOS程序也是一样的,但是我们从没看到过iOS程序打开之后直接闪退,肯定是有一些东 ...
- Windows下搭建HTTP/HTTPS服务器及测试过程
1 安装Apache http://www.apachehaus.com/cgi-bin/download.plx 选择合适的版本下载 本次下载的是 Apache 2.4.x VC14 Apache版 ...
- Vue.js 系列教程 3:Vue-cli,生命周期钩子
原文:intro-to-vue-3-vue-cli-lifecycle-hooks 译者:nzbin 这是 JavaScript 框架 Vue.js 五篇教程的第三部分.在这一部分,我们将学习 Vue ...
- HTTP学习(一)初识HTTP
作为一名准前端开发工程师,必须要对http基础知识有一定的了解,可是想学习HTTP相关的知识,发现国内只有两本相关的图书,<HTTP权威指南>和<图解http>,所有的书但凡带 ...
- 传输控制协议TCP
TCP主要特点: (1)面向连接 (2)只能是点到点 (3)可靠的传输协议 (4)全双工通信,各自各自的读写缓冲区,应用层吧数据交给发送缓冲区,tcp合适就发送了,接受的时候tcp写入接受缓冲区,应用 ...