[size=large]
1 了解程序、进程、
线程的概念
进程是指运行中的应用程序,每一个进程都有自己独立的
内存空间。
线程是进程内部单一的一个顺序控制流
基于进程的特点是允许计算机同时运行两个或更多的程序
基于线程的
多任务处理环境中,线程是最小的处理单位
基于线程所需的开销更少
在多任务中,各个进程需要分配它们自己独立的地址空间
多个线程可共享相同的地址空间并且共同分享同一个进程
进程间调用涉及的开销比线程间通信多
线程间的切换成本比进程间切换成本低
简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
2 主线程:
在Java程序启动时,一个线程立刻运行,该线程通常称为程序的主线程。
主线程的重要性体现在两个方面:
它是产生其他子线程的线程。
通常它必须最后完成执行,因为它执行各种关闭动作。
public class TestMainThread {
public static void main(String[] args) {
// 获取主线程
Thread thread = Thread.currentThread();
System.out.println("主线程:" + thread.getName());
System.out.println("主线程优先级:" + thread.getPriority());
System.out.println("主线程是否处于活动状态:" + thread.isAlive());
// 自定义线程的使用
System.out.println("自定义线程的使用!");
// 1 extends Thread
SubThread subThread = new SubThread();
subThread.setName("自定义线程1");
System.out.println("线程状态(启动前):" + subThread.getState());
// 启动线程
subThread.start();
System.out.println("线程状态(启动后):" + subThread.getState());
// 2 implements Runnable
ImpThread impThreadRunnable = new ImpThread();
Thread impThread = new Thread(impThreadRunnable);
impThread.start();
}
3 创建线程的两种方式:
声明一个 Thread 类的子类,并覆盖 run() 方法。
声明一个实现 Runnable
接口的类,并实现 run() 方法。
-----------------------------------------------------------------------------------------
线程的状态:
Thread.State 线程状态。线程可以处于下列状态之一:
1 NEW 至今尚未启动的线程处于这种状态。
2 RUNNABLE 正在 Java 虚拟机中执行的线程处于这种状态。
3 BLOCKED 受阻塞并等待某个监视器锁的线程处于这种状态。
4 WAITING 限期地等待另一个线程来执行某一特定操作的线程处于这种状态。
5 TIMED_WAITING 等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态。
6 TERMINATED 已退出的线程处于这种状态。
通过方法getState()获取线程的当前状态
-----------------------------------------------------------------------------------------------------------------
线程的优先级:
int MAX_PRIORITY 10 线程可以具有的最高优先级
int MIN_PRIORITY 1 线程可以具有的最低优先级
int NORM_PRIORITY 5 分配给线程的默认优先级
更改线程的优先级:setPriority(int newPriority)
获取线程的优先级 int getPriority()
-------------------------------------------------------------------------------------------------------
守护线程:
setDaemon(boolean b) 将线程标记为守护线程或用户线程。
当正在运行的线程都是守护线程时,Java 虚拟机退出。
该方法必须在启动线程前调用
-----------------------------------------------------------------------------------------------------------------
掌握如何创建,结束线程
--------------------------------结束线程
三种方式-----------------------------------------------------------------
线程常用方法总结:
Thread()
Thread(Runnable target);//将 target 作为其运行对象
Thread(String name);//指定线程名称,每个线程都有一个标识名,多个线程可以同名。如果线程创建时没有指定标识名,就会为其生成一个新名称
Thread(Runnable target, String name);
start() 启动线程;Java 虚拟机调用该线程的 run 方法//不能多次启动
run() 无须也不可调用,线程功能方法;
stop() //无条件中断线程;(不建议使用)
interrupt() //有条件中断线程;
sleep(long s) 使线程睡眠;让出cpu资源; (static),在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
currentThread() 获取当前正在执行的线程; (static)
isAlive() 判断线程是否在活动状态;如果线程已经启动且尚未终止,则为活动状态。
yield() 让出cpu资源;暂停当前正在执行的线程对象,并执行其他线程。
jion() 等待线程消亡;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class CloseThread {
public static void main(String[] args) {
// SubThread1 thread1 = new SubThread1();
// thread1.start();
// try {
// Thread.sleep(3000);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// thread1.setStop(true);
// SubThread2 thread2 = new SubThread2();
// thread2.start();
// try {
// Thread.sleep(3000);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// thread2.interrupt();
SubThread3 thread3 = new SubThread3();
thread3.start();
}
}
class SubThread1 extends Thread {
// 结束线程 1:修改标志
private boolean isStop;
int count;
public void setStop(boolean isStop) {
this.isStop = isStop;
}
@Override
public void run() {
System.out.println("线程开始了》》》》》》》》");
while (!isStop) {
System.out.println("线程计算:" + (count++));
}
System.out.println("线程结束了》》》》》》》》");
}
}
class SubThread2 extends Thread {
// 结束线程 2 interrupt()
int count;
@Override
public void run() {
System.out.println("线程开始了》》》》》》》》");
while (!this.isInterrupted()) {
System.out.println("线程计算:" + (count++));
}
System.out.println("线程结束了》》》》》》》》");
}
}
class SubThread3 extends Thread {
// 结束线程 3引发异常
File file = new File("./data/20_IO流编程1.txt");
FileInputStream fileInputStream = null;
int value;
SubThread3() {
try {
fileInputStream = new FileInputStream(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
try {
value=fileInputStream.read();
System.out.println(value);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
break;
}
}
}
}
4、 线程
同步:
什么是同步:当两个或多个线程需要访问同一资源时,它们需要以某种顺序来确保该资源某一时刻只能被一个线程使用的方式称为同步。
java如何实现同步:
两种方式实现同步:
使用同步方法:
synchronized void methodA() { }
使用同步块:
synchronized(object) {
//要同步的语句
}
public class Account {
private double money;
// 方法同步synchronized
public void add(double money) {
synchronized ("") {
double temp = this.money;
// 模拟网路延迟
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.money = temp + money;
}
}
public double getMoney() {
return this.money;
}
}
public class AccountThread extends Thread {
private Account account;
public AccountThread(Account account) {
this.account = account;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
this.account.add(100);
}
}
public static void main(String[] args) {
Account account = new Account();
System.out.println("开始存钱......");
// 模拟50个线程为同一账户存钱
AccountThread[] threads = new AccountThread[50];
for (int i = 0; i < threads.length; i++) {
threads[i] = new AccountThread(account);
threads[i].start();
}
// 等待存钱完毕
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("存钱完毕......");
System.out.println("账户余额:" + account.getMoney());
}
}
[/size]