方式1:

public class LiftOff implements Runnable {
protected int countDown = ;
private static int taskCount = ;
private final int id = taskCount++; public LiftOff() {
System.out.println("LiftOff Start:"+Thread.currentThread().getId());
} public LiftOff(int countDown) {
this.countDown = countDown;
} public String status() {
System.out.println("LiftOff tid:"+Thread.currentThread().getId());
return "#" + id + "(" + (countDown > ? countDown : "Liftoff!") + "),";
} public void run() { while (countDown-- > ) {
// System.out.print();
status();
//Thread.yield();
}
System.out.println("LiftOff End:"+Thread.currentThread().getId());
} }
public class BasicThreads {

    public static void main(String[] args){
System.out.println("main tid:"+Thread.currentThread().getId());
Thread t=new Thread(new LiftOff());
t.start();
System.out.println("Waiting for LiftOff");
}
}

方式2(首选):

不限制数量的线程池

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class CachedThreadPool { public static void main(String[] args) {
ExecutorService exec=Executors.newCachedThreadPool();
for (int i = ; i < ; i++) {
exec.execute(new LiftOff());
}
exec.shutdown();
}
}

方式3:

限制数量的线程池

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class FixedThreadPool {
public static void main(String[] args) {
ExecutorService exec=Executors.newFixedThreadPool();
for (int i = ; i < ; i++) {
exec.execute(new LiftOff());
}
exec.shutdown();
}
}

方式4:

线程顺序执行

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class SingleThreadExecutor {
public static void main(String[] args) {
ExecutorService exec = Executors.newSingleThreadExecutor();
for (int i = ; i < ; i++) {
exec.execute(new LiftOff());
}
exec.shutdown();
}
}

方式5:

调用线程并返回结果

import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; class TaskWithResult implements Callable<String> {
private int id; public TaskWithResult(int id) {
this.id = id;
} public String call() {
return "result of TaskWithResult " + id;
}
} public class CallableDemo {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService exec = Executors.newCachedThreadPool();
System.out.println(exec.submit(new TaskWithResult(50)).get());
ArrayList<Future<String>> results = new ArrayList<Future<String>>();
for (int i = 0; i < 10; i++) {
results.add(exec.submit(new TaskWithResult(i)));
}
for (Future<String> fs : results) {
try {
System.out.println(fs.get());
} catch (InterruptedException e) {
System.out.println(e);
return;
} catch (ExecutionException e) {
System.out.println(e);
} finally {
exec.shutdown();
}
}
} }

方式6:

后台线程,当主线程退出时(非后台线程),后台线程也自动退出

import java.util.concurrent.TimeUnit;

public class SimpleDaemons implements Runnable{

    public void run() {
try {
while (true) {
TimeUnit.MICROSECONDS.sleep(100);
System.out.println(Thread.currentThread()+" "+this);
//print(Thread.currentThread()+" "+this);
}
} catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) throws InterruptedException {
// for (int i = 0; i < 10; i++) {
Thread daemon=new Thread(new SimpleDaemons());
daemon.setDaemon(true);
daemon.start();
// }
System.out.println("All daemons started");
TimeUnit.MICROSECONDS.sleep(175);
System.out.println("All daemons end");
}
}

方式7:

后台线程的第二种写法

import java.util.concurrent.ThreadFactory;

public class DaemonThreadFactory implements ThreadFactory{

    @Override
public Thread newThread(Runnable r) {
Thread t=new Thread(r);
t.setDaemon(true);
return t;
} }
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; public class DaemonFromFactory implements Runnable{
public void run() {
try {
while (true) {
TimeUnit.MICROSECONDS.sleep(100);
System.out.println(Thread.currentThread()+" "+this);
}
} catch (Exception e) {
System.out.println("Interrupted");
}
} public static void main(String[] args) throws InterruptedException {
ExecutorService exec=Executors.newCachedThreadPool(new DaemonThreadFactory());
for (int i = 0; i < 10; i++) {
exec.execute(new DaemonFromFactory());
}
System.out.println("All daemons started");
TimeUnit.MILLISECONDS.sleep(500);
}
}

方式8:

通过继承Thread类

public class SimpleThread extends Thread {

    private int countDown = 5;
private static int threadCount = 0; public SimpleThread() {
super(Integer.toString(++threadCount));
start();
} public String toString() {
return "#" + getName() + "(" + countDown + "),";
} public void run() {
while (true) {
System.out.println(this);
if(--countDown==0)
return;
}
}
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
new SimpleThread();
}
}
}

方式9:

匿名内部类

import java.util.concurrent.TimeUnit;

class InnerThread1 {
private int countDown = 5;
private Inner inner; private class Inner extends Thread {
Inner(String name) {
super(name);
start();
} public void run() {
try {
while (true) {
System.out.println(this);
if (--countDown == 0)
return;
sleep(10);
}
} catch (Exception e) {
System.out.println("interrupted");
}
} public String toString() {
return getName() + ":" + countDown;
}
} public InnerThread1(String name) {
inner = new Inner(name);
}
} class InnerThread2 {
private int countDown = 5;
private Thread t; public InnerThread2(String name) {
t = new Thread(name) {
public void run() {
try {
while (true) {
System.out.println(this);
if (--countDown == 0)
return;
sleep(10);
}
} catch (Exception e) {
System.out.println("sleep() interrupted");
}
}
};
t.start();
}
} class InnerRunnable1 {
private int countDown = 5;
private Inner inner; private class Inner implements Runnable {
Thread t; Inner(String name) {
t = new Thread(this, name);
t.start();
} public void run() {
try {
while (true) {
System.out.println(this);
if (--countDown == 0)
return;
TimeUnit.MILLISECONDS.sleep(10);
}
} catch (Exception e) {
System.out.println("sleep() interrupted");
}
} public String toString() {
return t.getName() + ":" + countDown;
}
} public InnerRunnable1(String name) {
inner = new Inner(name);
}
} class InnerRunnable2 {
private int countDown = 5;
private Thread t; public InnerRunnable2(String name) {
t = new Thread(new Runnable() {
@Override
public void run() {
try {
while (true) {
System.out.println(this);
if (--countDown == 0)
return;
TimeUnit.MICROSECONDS.sleep(10);
}
} catch (Exception e) {
System.out.println("sleep() interrupted");
}
} public String toString() {
return Thread.currentThread().getName() + ":" + countDown;
}
}, name);
t.start();
}
} class ThreadMethod {
private int countDown = 5;
private Thread t;
private String name; public ThreadMethod(String name) {
this.name = name;
} public void runTask() {
if (t == null) {
t = new Thread(name) {
public void run() {
try {
while (true) {
System.out.println(this);
if (--countDown == 0)
return;
sleep(10);
}
} catch (Exception e) {
System.out.println("sleep() interrupted");
}
} public String toString() {
return getName() + ":" + countDown;
}
};
t.start();
}
}
} public class ThreadVariations {
public static void main(String[] args) {
new InnerThread1("InnerThread1");
new InnerThread2("InnerThread2");
new InnerRunnable1("InnerRunnable1");
new InnerRunnable2("InnerRunnable2");
new ThreadMethod("ThreadMethod").runTask();
}
}

java多线程的使用1的更多相关文章

  1. 40个Java多线程问题总结

    前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...

  2. Java多线程基础知识篇

    这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...

  3. Java多线程系列--“JUC锁”03之 公平锁(一)

    概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...

  4. Java多线程系列--“JUC锁”04之 公平锁(二)

    概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...

  5. Java多线程--让主线程等待子线程执行完毕

    使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...

  6. Java多线程 2 线程的生命周期和状态控制

    一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...

  7. java 多线程 1 线程 进程

    Java多线程(一).多线程的基本概念和使用 2012-09-10 16:06 5108人阅读 评论(0) 收藏 举报  分类: javaSE综合知识点(14)  版权声明:本文为博主原创文章,未经博 ...

  8. 一起阅读《Java多线程编程核心技术》

    目录 第一章 Java多线程技能 (待续...)

  9. 第一章 Java多线程技能

    1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...

  10. java从基础知识(十)java多线程(下)

    首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 ...

随机推荐

  1. 科普:浅谈 Hellinger Distance

    浅谈 Hellinger Distance 2016.05.24 最近在看 Hellinger Distance(海林格距离), 平时看多了欧式距离,马氏距离等等,貌似介绍这个的材料不是很多,例如:维 ...

  2. 【转载】使用LFM(Latent factor model)隐语义模型进行Top-N推荐

    最近在拜读项亮博士的<推荐系统实践>,系统的学习一下推荐系统的相关知识.今天学习了其中的隐语义模型在Top-N推荐中的应用,在此做一个总结. 隐语义模型LFM和LSI,LDA,Topic ...

  3. Entity Framework 全面教程详解(转)

    目录 预备知识    2 LINQ技术 2 LINQ技术的基础 - C#3.0    2 自动属性    2 隐式类型    2 对象初始化器与集合初始化器    3 匿名类    3 扩展方法    ...

  4. 028. asp.net数据绑定控件值DataList控件

    DataList控件可以使用模板与定义样式来显示数据并进行数据的选择, 删除及编辑工作. DataList控件的最大特点是一定要通过模板来定义数据的显示格式. 如果要设计出美观的界面, 就需要花费一番 ...

  5. 023. Asp.net参数化查询预防Sql注入攻击

    /// <summary> /// 参数化查询预防SQL注入式攻击 /// </summary> public int checkLogin(string loginName, ...

  6. sqlserver模糊查询【转】

    http://blog.csdn.net/liuxinxin1125/article/details/5444873 SELECT * FROM user WHERE name LIKE ';%三%' ...

  7. android 添加依赖的库文件

    Notpad: 2016-3-16: 1.android 添加依赖的库文件 右键自己的项目 -> properties ->android ->在Library处点击add -> ...

  8. android中的EditView控件

    android中的EditView控件 EditText继承关系:View-->TextView-->EditText ,EditText是可编辑文本框 1.EditText默认情况下,光 ...

  9. Oracle NoLogging Append 方式减少批量insert的redo_size

    业务处理中,很多时候使用实表临时表处理中间结果,而实表的Insert操作缺省会记录redo log,针对此问题收集相关测试总结信息如下: [转] 常见dml.ddl语句使用nologging选项所生成 ...

  10. 【性能诊断】八、并发场景的性能分析(windbg案例,连接泄露)

    此前遇到一个项目反馈系统宕机问题,摘要描述如下: 系统不定期出现卡死现象,在多个模块不同功能上都出现过,未发现与特定功能相关的明显规律: 当系统出现卡死现象时,新的用户无法登陆系统: 跟踪应用服务器, ...