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) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度 ...
随机推荐
- Log4j的扩展-支持设置最大日志数量的DailyRollingFileAppender
Log4j现在已经被大家熟知了,所有细节都可以在网上查到,Log4j支持Appender,其中DailyRollingFileAppender是被经常用到的Appender之一.在讨论今天的主题之前, ...
- SQL迅速增加表中记录语句
很多时候我么需要为表中疯狂增加N条记录,那么我们该使用什么语句实现该功能呢?如下: insert into 表名(字段1,字段2,字段3....) select 字段1,字段2,字段3.... fr ...
- 邮件报警shell脚本
温馨提示 首先要安装postfix 或者 sendmail 等邮件服务器 1.Apache #!/bin/bash #apache.sh nc -w2 localhost 80 if[ $? -ne ...
- MySQL数据类型--日期时间
一.博客前言 自接触学习MySQL已有一段时间了,对于MySQL的基础知识还是略懂略懂的.在这一路学习过来,每次不管看书还是网上看的资料,对于MySQL数据类型中的时间日期类型总是一扫而过,不曾停下来 ...
- 基于.NET Core的Hypertext Application Language(HAL)开发库
HAL,全称为Hypertext Application Language,它是一种简单的数据格式,它能以一种简单.统一的形式,在API中引入超链接特性,使得API的可发现性(discoverable ...
- Exiting the Matrix: Introducing Metasploit's Hardware Bridge
Metasploit is an amazing tool. You can use it to maneuver through vast networks, pivoting through se ...
- Linux(Ubuntu)下载安装破解Matlab2016
跳过废话, 直接看教程 前言 笔者平常不是很喜欢用Matlab, 因为所需要的功能都能被Python替代, 而Matlab的肥和慢实在令人难以忍受. 在Linux系统下安装Matlab也比Window ...
- MVC View显示详解(RenderBody,RenderPage,RenderSection,Partial)
一.Views文件夹 -> Shared文件夹下的 _Layout.cshtml 母版页 @RenderBody 当创建基于_Layout.cshtml布局页面的视图时,视图的内容会和布局页面合 ...
- [译] AR SDK的种类比你想得要多!这里介绍七个棒棒哒
作者:Eddie Offermann 原文:There are dozens more Augmented Reality SDKs than you think! Here are seven gr ...
- TypeScript和JavaScript哪种语言更先进
TypeScript和JavaScript哪种语言更先进 近两年来最火爆的技术栈毫无争议的是JavaScript,随着ES6的普及,不管是从前端的浏览器来看,还是后端的NodeJS场景,JavaScr ...