Java多线程之线程其他类



实际编码中除了前面讲到的常用的类之外,还有几个其他类也有可能用得到,这里来统一整理一下:

1,Callable接口和Future接口

JDK1.5以后提供了上面这2个接口,可以把Callable接口看成Runnable接口的增强版,Callable接口提供call方法作为线程执行体,但是call方法比run方法强大,call方法可以有返回值,call方法可以声明抛出异常。为了获取call方法的返回值,JDK1.5提供了Future接口来代表Callable接口里面call方法的返回值,并提供了一个FutureTask实现类,可以作为Thread类的target。值得注意的是:Callable接口有泛型限制,Callable接口里面的泛型形参类型与call方法返回值类型相同。

具体代码如下:

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask; public class LinkinCallable implements Callable<Integer>
{ @Override
public Integer call() throws Exception
{
int j = 0;
for (; j < 100; j++)
{
System.out.println(Thread.currentThread().getName() + " " + j);
}
return j;
} public static void main(String[] args)
{
//创建一个Callable对象
LinkinCallable linkin = new LinkinCallable();
//包装Callable对象
FutureTask<Integer> task = new FutureTask<Integer>(linkin);
for (int i = 0; i < 100; i++)
{
System.out.println(Thread.currentThread().getName() + " " + i);
if (i == 20)
{
//用FutureTask作为Thread的target来创建一个线程,然后在启动这个线程
new Thread(task, "这里的这个线程是有返回值的").start();
}
}
try
{
System.out.println(task.get());
}
catch (Exception e)
{
e.printStackTrace();
}
} }

2,ThreadLocal类

该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。 ThreadLocal是用另外一个角度来解决多线程的并发访问的,它并不是像同步机制那样解决多个线程对相同资源的并发访问,它只是隔离了多个线程之间的共享冲突,每一个线程之间都会有自己的一份资源副本。

具体代码如下:

 

public class Account
{
//定义一个ThreadLocal类型的变量,该变量将是一个线程局部变量 每个线程都会保留该变量的一个副本
private ThreadLocal<String> name = new ThreadLocal<String>(); // 定义一个初始化name属性的构造器
public Account(String str)
{
this.name.set(str);
// 下面代码用于访问当前线程的name副本的值
System.out.println("---" + this.name.get());
} // name的setter和getter方法
public String getName()
{
return name.get();
} public void setName(String str)
{
this.name.set(str);
} public static void main(String[] args)
{
// 启动两条线程,两条线程共享同一个Account
Account at = new Account("初始名");
/*
* 虽然两条线程共享同一个账户,即只有一个账户名 但由于账户名是ThreadLocal类型的,所以每条线程
* 都完全拥有各自的账户名副本,所以从i == 6之后,将看到两条 线程访问同一个账户时看到不同的账户名。
*/
new MyTest(at, "线程甲").start();
new MyTest(at, "线程乙").start();
}
} class MyTest extends Thread
{
// 定义一个Account属性
private Account account; public MyTest(Account account, String name)
{
super(name);
this.account = account;
} public void run()
{
// 循环10次
for (int i = 0; i < 10; i++)
{
// 当i == 6时输出将账户名替换成当前线程名
if (i == 6)
{
account.setName(getName());
}
// 输出同一个账户的账户名和循环变量
System.out.println(account.getName() + " 账户的i值:" + i);
}
}
}

Java多线程之线程其他类的更多相关文章

  1. Java多线程之线程的通信

    Java多线程之线程的通信 在总结多线程通信前先介绍一个概念:锁池.线程因为未拿到锁标记而发生的阻塞不同于前面五个基本状态中的阻塞,称为锁池.每个对象都有自己的锁池的空间,用于放置等待运行的线程.这些 ...

  2. Java多线程之线程的同步

    Java多线程之线程的同步 实际开发中我们也经常提到说线程安全问题,那么什么是线程安全问题呢? 线程不安全就是说在多线程编程中出现了错误情况,由于系统的线程调度具有一定的随机性,当使用多个线程来访问同 ...

  3. Java多线程02(线程安全、线程同步、等待唤醒机制)

    Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...

  4. JAVA多线程之线程间的通信方式

    (转发) 收藏 记 周日,北京的天阳光明媚,9月,北京的秋格外肃穆透彻,望望窗外的湛蓝的天,心似透过栏杆,沐浴在这透亮清澈的蓝天里,那朵朵白云如同一朵棉絮,心意畅想....思绪外扬, 鱼和熊掌不可兼得 ...

  5. java多线程与线程间通信

    转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...

  6. Java多线程之线程的状态迁移

    Java多线程之线程的状态迁移 下图整理了线程的状态迁移.图中的线程状态(Thread.Stat 中定义的Enum 名)NEW.RUNNABLE .TERMINATED.WAITING.TIMED_W ...

  7. Java多线程之线程协作

    Java多线程之线程协作 一.前言 上一节提到,如果有一个线程正在运行synchronized 方法,那么其他线程就无法再运行这个方法了.这就是简单的互斥处理. 假如我们现在想执行更加精确的控制,而不 ...

  8. Java多线程之线程的互斥处理

    Java多线程之线程的互斥处理 一.前言 多线程程序中的各个线程都是自由运行的,所以它们有时就会同时操作同一个实例.这在某些情况下会引发问题.例如,从银行账户取款时,余额确认部分的代码应该是像下面这样 ...

  9. Java多线程之线程的暂停

    Java多线程之线程的暂停 下面该稍微休息一下了呢……不过,这里说的是线程休息,不是我们哦.本节将介绍一下让线程暂停运行的方法. 线程Thread 类中的sleep 方法能够暂停线程运行,Sleep ...

随机推荐

  1. Python基础-*args和**kwargs魔法变量

    在学习Python时,总会遇到*args和**kwargs这两个魔法变量,那么它们到底是什么? 首先,并不是必须写成*args和**kwargs.只有变量前面的*(星号)才是必须的,你也可以写成*va ...

  2. javascript 之this指针-11

    前言 在<javascript 之执行环境-08>文中说到,当JavaScript代码执行一段可执行代码时,会创建对应的执行上下文(execution context).对于每个执行上下文 ...

  3. golang 类型断言的学习

    在php中有一个 serialize() 函数 可以把数组序列化成字符串进行存储和传输 如果想反序列化这种字符串,在php中只需要一个简单的unserialize() 函数就可以完成了.但是在gola ...

  4. hive入门(一)、什么是hive

    1.Hive 基本概念 Hive是基于Hadoop的一个 数据仓库工具,可以将结构化的数据文件映射成一张表,并提供类SQL查询功能: Hive是构建在Hadoop 之上的数据仓库: 使用HQL作为查询 ...

  5. Java编程思想读书笔记(二)【一切都是对象】

    begin 2018年1月9日17:06:47 第二章 一切都是对象 Java语言假设我们只进行面向对象的程序设计. 2.1 用引用操纵对象 每种编程语言都有自己的操纵内存元素的方式 操纵内存元素的方 ...

  6. Windows10 环境下安装 ElasticSearch

    环境与版本 操作系统:windows 10 Elasticsearch 版本:6.1.1 Java 版本:9.0.1 ik 分词器版本:6.1.1 安装步骤 前置要求 操作系统中需要安装有 java ...

  7. Codeforces 725B Food on the Plane

    B. Food on the Plane time limit per test:2 seconds memory limit per test:256 megabytes input:standar ...

  8. 让两个数x,y一直保持互质的模版

    int gcd(int x,int y) { )return x; else return gcd(y,x%y); }

  9. [51nod1474]宝藏图

    有n堆宝藏,每一堆宝藏有一个挖掘所需要的时间ti,有一个价值qi. 现在是做一个宝藏图.这个宝藏图是这样的,宝藏图的形状是一棵二叉树,二叉树刚好有k个叶子结点,从n堆宝藏中选k堆放到二叉树的叶子结点上 ...

  10. [bzoj2843&&bzoj1180]极地旅行社 (lct)

    双倍经验双倍的幸福... 所以另一道是300大洋的世界T_T...虽然题目是一样的,不过2843数据范围小了一点... 都是lct基本操作 #include<cstdio> #includ ...