java--线程认识与实例记录 NO.1
下面的内容都是从java编程思想一书中摘取出来,我认为很有产考价值,并且便于后续使用。
主要内容是记录继承thread和实现runnable接口两种方式的代码用法,及内部类中启用线程的用法。
1、首先看下一个继承Thread类的用法,通过第13行代码,在构造方法中通过start开启线程。
然后程序执行SimpleThread类的run方法。
package concurrency; //: concurrency/SimpleThread.java
// Inheriting directly from the Thread class. public class SimpleThread extends Thread {
private int countDown = 5;
private static int threadCount = 0; public SimpleThread() {
// Store the thread name:
super(Integer.toString(++threadCount));
start();
} public String toString() {
return "#" + getName() + "(" + countDown + "), ";
} public void run() {
while (true) {
System.out.print(this);
if (--countDown == 0)
return;
}
} public static void main(String[] args) {
for (int i = 0; i < 5; i++)
new SimpleThread();
}
}
2、下面是一个实现Runnable接口的实例方法:
通过对比两个程序的用法上大致相同,区别在于实现接口的类可以再继承其他的类。
package concurrency; //: concurrency/SelfManaged.java
// A Runnable containing its own driver Thread. public class SelfManaged implements Runnable {
private int countDown = 5;
private Thread t = new Thread(this); public SelfManaged() {
t.start();
} public String toString() {
return Thread.currentThread().getName() + "(" + countDown + "), ";
} public void run() {
while (true) {
System.out.print(this);
if (--countDown == 0)
return;
}
} public static void main(String[] args) {
for (int i = 0; i < 5; i++)
new SelfManaged();
}
}
3、基于继承thread和实现runnable接口的内部类,实现方式:
package concurrency; //: concurrency/ThreadVariations.java
// Creating threads with inner classes.
import java.util.concurrent.*;
import static net.mindview.util.Print.*; // Using a named inner class:
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) {
print(this);
if (--countDown == 0)
return;
sleep(10);
}
} catch (InterruptedException e) {
print("interrupted");
}
} public String toString() {
return getName() + ": " + countDown;
}
} public InnerThread1(String name) {
inner = new Inner(name);
}
} // Using an anonymous inner class:
class InnerThread2 {
private int countDown = 5;
private Thread t; public InnerThread2(String name) {
t = new Thread(name) {
public void run() {
try {
while (true) {
print(this);
if (--countDown == 0)
return;
sleep(10);
}
} catch (InterruptedException e) {
print("sleep() interrupted");
}
} public String toString() {
return getName() + ": " + countDown;
}
};
t.start();
}
} // Using a named Runnable implementation:
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) {
print(this);
if (--countDown == 0)
return;
TimeUnit.MILLISECONDS.sleep(10);
}
} catch (InterruptedException e) {
print("sleep() interrupted");
}
} public String toString() {
return t.getName() + ": " + countDown;
}
} public InnerRunnable1(String name) {
inner = new Inner(name);
}
} // Using an anonymous Runnable implementation:
class InnerRunnable2 {
private int countDown = 5;
private Thread t; public InnerRunnable2(String name) {
t = new Thread(new Runnable() {
public void run() {
try {
while (true) {
print(this);
if (--countDown == 0)
return;
TimeUnit.MILLISECONDS.sleep(10);
}
} catch (InterruptedException e) {
print("sleep() interrupted");
}
} public String toString() {
return Thread.currentThread().getName() + ": " + countDown;
}
}, name);
t.start();
}
} // A separate method to run some code as a task:
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) {
print(this);
if (--countDown == 0)
return;
sleep(10);
}
} catch (InterruptedException e) {
print("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();
}
} /* (Execute to see output) */// :~
截图说明:
java--线程认识与实例记录 NO.1的更多相关文章
- java 线程池 使用实例
在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...
- 11 java 线程池 使用实例
在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...
- [Java基础] Java线程复习笔记
先说说线程和进程,现代操作系统几乎无一例外地采用进程的概念,进程之间基本上可以认为是相互独立的,共享的资源非常少.线程可以认为是轻量级的进 程,充分地利用线程可以使得同一个进程中执行多种任务.Java ...
- Java线程基础实例
概述 Java线程是一个在实战开发中经常使用的基础功能,而在Java中线程相关的类在java.lang和java.util.concurrent里 Thread package thread.base ...
- (转)java线程安全问题之静态变量、实例变量、局部变量
java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编程实践>中所说: 写道 给线程安全下定义比较困难.存在很多种定义,如 ...
- java线程安全问题之静态变量、实例变量、局部变量
java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编程实践>中所说: 写道 给线程安全下定义比较困难.存在很多种定义,如 ...
- java线程间通信1--简单实例
线程通信 一.线程间通信的条件 1.两个以上的线程访问同一块内存 2.线程同步,关键字 synchronized 二.线程间通信主要涉及的方法 wait(); ----> 用于阻塞进程 noti ...
- Java线程并发:知识点
Java线程并发:知识点 发布:一个对象是使它能够被当前范围之外的代码所引用: 常见形式:将对象的的引用存储到公共静态域:非私有方法中返回引用:发布内部类实例,包含引用. 逃逸:在对象尚未准备 ...
- Java线程的概念
1. 计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓 ...
- java线程与并发(一)
有好几个月没写博客了,各种破事儿忙完,决定继续写博客,恰好最近想了解下有关Java并发的一些知识,所以就准备这一段时间,用零碎的时间多记录一点有关并发的知识.希望这次能一直坚持下去. 想了解并发,必须 ...
随机推荐
- [转]eclipse转idea, 快捷键设置
原文地址: eclipse转idea, 快捷键设置 设置快捷键的途径: 打开idea的配置,找到Keymap,设置为eclipse 另外还要手动设置某些快捷键 上下移动 点击类打开 代码提示 查询 ...
- javaSrript_数据类型(2017-03-15)
一.综述 javaScript中的数据类型分为两类: 基本类型: undefined:未定义.当声明变量却没有赋值时会显示该值.可以为变量赋值为undefined null:空.无.表示不存在,当为对 ...
- Unity中Web.Config文件的配置与调用
在上一篇文章“Unit简单依赖注入”我们可以实现构造对象和被依赖对象之间的 松耦合,使我们的抽象层(Player)能够保持稳定,但是在并没有把客户类和Player类之间彻底解耦,即当我们不想使用MP3 ...
- MySQL客户端输出窗口显示中文乱码问题解决办法
最近发现,在MySQL的dos客户端输出窗口中查询表中的数据时,表中的中文数据都显示成乱码,如下图所示:
- .net连mysql数据库汇总
另外MySql官方出了一个在csharp里面连接MySql的Connector,可以试试 http://dev.mysql.com/downloads/#connector-net <add n ...
- iPhone上将短信内容发送到指定邮箱的方法
iPhone上将短信内容发送到指定邮箱的方法 迄今为止,移动应用安全基本聚焦在以下几个方面,一是移动设备管理BYOD(bring your own device),二是移动恶意软件分析,三是移动设备用 ...
- cocos2d-x retain和release倒底怎么玩?
转载请注明,原文地址: http://blog.csdn.net/musicvs/article/details/8689345 正文: 1. 为什么会有retain? C++和Java不一样,Jav ...
- WCF:该不该用枚举值
WCF支持枚举,不过在个别场景下会出现服务消费失败,如:传递或返回的枚举值(本质是int或其它)没有在枚举中定义.这种异常还很难定位,出现这种情况一般是因为BUG,因此简单的放弃使用枚举可能不是一个明 ...
- 快速排序原理及Java实现
1.基本思想: 快速排序是我们之前学习的冒泡排序的升级,他们都属于交换类排序,都是采用不断的比较和移动来实现排序的.快速排序是一种非常高效的排序算法,它的实现,增大了记录的比较和移动的距离,将关键字较 ...
- centOS7下实践查询版本/CPU/内存/硬盘容量等硬件信息
1.系统 1.1版本 uname -a 能确认是64位还是32位,其它的信息不多 [root@localhost ~]# uname -a Linux localhost.localdomain 3. ...