JAVA 之"线程"
2015-07-12 17:56
435 查看
1、进程与线程:
《1》什么是进程:是指运行中的应用程序,每一个进程都有自己独立的内存空间,
一个应用程序可以同时启动多个进程,(静态)比如(IE,JVM)
《2》什么是线程:是指进程中的一个执行流程,有时有称之为执行情景,
一个进程有多个线程组成(动态)
《3》进程与线程的主要区别:
每个进程都需要操作系统为其分配独立的内存地址空间,
而同一进程中的所有线程在同一块地址空间中工作,
这些线程可以共享同 一块内存和系统资源
2、线程的创建(两种方式):
《1》继承Thread类(一般在不继承其他类的情况下)
《2》实现Runnable接口(一般在继承其他类的情况下)
3、线程创建的步骤:
《1》第一种
(1)自定义线程类继承Thread类;
(2)覆盖Thread类中的run()方法;
(3)创建该线程类对象;
(4)调用该线程类对象中的start()方法启动线程。
《2》第二种
(1)自定义线程类实现Runnable接口;
(2)覆盖Runnable接口中的run()方法;
(3)创建该线程类对象;
(4)创建Thread对象,构造参数为该线程类对象;
(5)调用Thread对象中的start()方法启动线程。
4、线程的实际应用以及注意事项:
《1》主线程与用户自定义线程并发执行;
《2》多个线程共享同一个对象的实例变量;
《3》不要随便覆盖Thread类中的start()方法
如果一定要覆盖start()方法,那么就首先调用super.start()方法;
《4》一个线程只能被启动一次;
《5》一般涉及操作同一个数据的程序,不使用多线程并发执行,
以保证数据的安全性。
5、两个线程交互执行:
《1》两个线程需要有同一个标记锁;
《2》两个线程中的代码要用 synchronized 修饰。
6、实例代码:
利用两个线程的交互执行打印 A 1 2 B 3 4 C 5 6……
[java] view
plaincopy
package day5;
public class ThreadT {
public static void main(String[] args) {
Object obj = new Object();
// 创建、启动通过继承Thread类来得到的线程
//给对象一个obj的标记锁
ThreadA ta = new ThreadA(obj);
ta.start();
// 创建、启动通过实现Runnable接口得到的线程
//给对象一个obj的标记锁
ThreadB tb = new ThreadB(obj);
Thread th = new Thread(tb);
th.start();
}
}
class ThreadA extends Thread {
private Object obj;
public ThreadA(Object obj) {
super();
this.obj = obj;
}
public void run() {
// 带有标记锁的代码,只有拿到标记锁才运行
synchronized (obj) {
for (char i = 'A'; i <= 'Z'; i++) {
System.out.print(i + " ");
// 唤醒队列中所有对象
obj.notifyAll();
try {
if (i != 'Z') {
// 放入等待队列
obj.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
class ThreadB implements Runnable {
private Object obj;
public ThreadB(Object obj) {
super();
this.obj = obj;
}
public void run() {
// 带有标记锁的代码,只有拿到标记锁才运行
synchronized (obj) {
for (int i = 1; i <= 26; i++) {
System.out.print(i * 2 - 1 + " ");
System.out.print(i * 2 + " ");
System.out.println();
// 唤醒队列中所有对象
obj.notifyAll();
try {
if (i != 26) {
// 放入等待队列
obj.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
http://blog.csdn.net/anlisten/article/details/4842671
《1》什么是进程:是指运行中的应用程序,每一个进程都有自己独立的内存空间,
一个应用程序可以同时启动多个进程,(静态)比如(IE,JVM)
《2》什么是线程:是指进程中的一个执行流程,有时有称之为执行情景,
一个进程有多个线程组成(动态)
《3》进程与线程的主要区别:
每个进程都需要操作系统为其分配独立的内存地址空间,
而同一进程中的所有线程在同一块地址空间中工作,
这些线程可以共享同 一块内存和系统资源
2、线程的创建(两种方式):
《1》继承Thread类(一般在不继承其他类的情况下)
《2》实现Runnable接口(一般在继承其他类的情况下)
3、线程创建的步骤:
《1》第一种
(1)自定义线程类继承Thread类;
(2)覆盖Thread类中的run()方法;
(3)创建该线程类对象;
(4)调用该线程类对象中的start()方法启动线程。
《2》第二种
(1)自定义线程类实现Runnable接口;
(2)覆盖Runnable接口中的run()方法;
(3)创建该线程类对象;
(4)创建Thread对象,构造参数为该线程类对象;
(5)调用Thread对象中的start()方法启动线程。
4、线程的实际应用以及注意事项:
《1》主线程与用户自定义线程并发执行;
《2》多个线程共享同一个对象的实例变量;
《3》不要随便覆盖Thread类中的start()方法
如果一定要覆盖start()方法,那么就首先调用super.start()方法;
《4》一个线程只能被启动一次;
《5》一般涉及操作同一个数据的程序,不使用多线程并发执行,
以保证数据的安全性。
5、两个线程交互执行:
《1》两个线程需要有同一个标记锁;
《2》两个线程中的代码要用 synchronized 修饰。
6、实例代码:
利用两个线程的交互执行打印 A 1 2 B 3 4 C 5 6……
[java] view
plaincopy
package day5;
public class ThreadT {
public static void main(String[] args) {
Object obj = new Object();
// 创建、启动通过继承Thread类来得到的线程
//给对象一个obj的标记锁
ThreadA ta = new ThreadA(obj);
ta.start();
// 创建、启动通过实现Runnable接口得到的线程
//给对象一个obj的标记锁
ThreadB tb = new ThreadB(obj);
Thread th = new Thread(tb);
th.start();
}
}
class ThreadA extends Thread {
private Object obj;
public ThreadA(Object obj) {
super();
this.obj = obj;
}
public void run() {
// 带有标记锁的代码,只有拿到标记锁才运行
synchronized (obj) {
for (char i = 'A'; i <= 'Z'; i++) {
System.out.print(i + " ");
// 唤醒队列中所有对象
obj.notifyAll();
try {
if (i != 'Z') {
// 放入等待队列
obj.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
class ThreadB implements Runnable {
private Object obj;
public ThreadB(Object obj) {
super();
this.obj = obj;
}
public void run() {
// 带有标记锁的代码,只有拿到标记锁才运行
synchronized (obj) {
for (int i = 1; i <= 26; i++) {
System.out.print(i * 2 - 1 + " ");
System.out.print(i * 2 + " ");
System.out.println();
// 唤醒队列中所有对象
obj.notifyAll();
try {
if (i != 26) {
// 放入等待队列
obj.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
http://blog.csdn.net/anlisten/article/details/4842671
相关文章推荐
- Spring4 MVC json问题(406 Not Acceptable)
- JAVA 接口 抽象类 的区别
- 关于spring+springMVC+myBatis的一些基础配置以及整合
- 读取kafka 0.8 简单例子
- Java 自定义注解释义
- Java运行过程
- MyEclipse启动报错:Failed to load JavaHL Library.
- Eclipse和Android Studio下使用Google Gson解析Json数据示例
- Struts2之数据标签(一)
- mac下eclipse的快捷键
- springmvc json
- Eclipse CDT无法产生二进制文件问题。
- git下载Spring项目源码并构建为eclipse工程
- java中的重载与重写
- 《Spring技术内幕》笔记-第四章 Spring MVC与web环境
- Springmvc异步上传文件
- 第1章Java开发入门
- Java的文件名必须和公共类名相同
- Java的内部类
- IDEA下JAVA 调用GDAL读写tif文件