什么是进程:
正在执行的程序.
什么是线程:
线程就是进程执行中的一个控制流程.
一个进程中至少有一个控制流程.
仅有一个控制流程的程序称为单线程.
多线程:
一个进程中当有多个控制单元时,就称为多线程程序.
多线程的好处:
1.提高程序的执行效率.
2.可以让多部分代码同时执行.
多线程的特性:
随机性.
线程的状态:
创建线程方式:
1.继承Thread类
1)继承Thread类.
2)复写run方法,将多线程需要运行的代码存入该方法中.
3)创建Thread的子类对象.(创建线程).
4)调用对象的start方法开启线程.(start方法做了两个动作,开启线程,调用run方法)
2.实现Runnable接口
- 定义线程代码所属类实现Runnable接口。
- 复写Runnable接口中的run方法,将多线程要运行的代码存入其中。
- 创建Runnable接口的子类对象。
- 创建Thread类的对象,并将Runnable接口的子类对象做为参数传递给Thread类多大构造函数
- 调用Thread类对象的start方法开启线程并执行指定的run方法。
多线程中的不安全隐患解决:
只要在同一时间段,只让一个线程将这些操作同一资源的代码执行完即可。
数据同步方式来解决多线程不安全隐患;
实现原理:通过带锁的代码块将容易出现问题的代码进行封装。
同步好处:解决线程安全问题。
同步弊端:降低了运行效率。(判断锁较为消耗资源);
同步表现形式:
1.同步代码块
示例:
synchronized(对象锁){
// 需要被同步的代码(哪些需要同步,哪些不需要同步一定要分清楚)
System.out.println("同步代码块");
}
2.同步函数
示例:
public synchronized void syncFunction(){
System.out.println("同步函数");
}
同步的前提:
1.必须是两个或者两个以上的线程。
2.多个线程必须使用同一个锁。
线程中的优先级:可以提高线程抢到资源的频率。
setPriority(int):对优先级进行设定,1~10之间。
自定义线程名称:
可以通过Thread构造函数,也可以通过setName
将线程标记为守护线程:
线程分:前台线程和后台线程,当前台线程运行完成时,无论是否有后台线程还在存活都会结束,jvm结束。
setDaemon(boolean);
join()方法:主线程调用了thread.join()方法,主线程会释放资源(执行权),等待thread线程结束后再继续执行,那么这时主线程是处于冻结状态,只有thread结束它才会恢复可运行状态。
线程示例:
/**
* 线程示例
* @author Administrator
*
*/
publicclass MyThread extends Thread {
privateString name;
MyThread(Stringname) {
this.name= name;
}
publicvoid run() {
for(int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()
+".....name = " + name + "..." + i);
}
}
}
多线程函数示例:
/**
* 多线程同步代码块
* @author Administrator
*
*/
public classMorThread implements Runnable {
privateint tick = 100;
privateObject obj = new Object();
/**
*线程运行方法(同步代码块)
*/
publicvoid run() {
while(true) {
synchronized(obj) {
if(tick > 0) {
System.out.println(Thread.currentThread().getName()+ " "
+tick--);
}else {
break;
}
}
}
}
}
/**
* 多线程同步函数
*
* @author Administrator
*
*/
public classMorThreadFunction implements Runnable {
privateint tick = 100;
publicvoid run() {
while(true) {
if(tick <= 0)
break;
show();
}
}
privatesynchronized void show() {
if(tick > 0) {
try{
Thread.sleep(100);
}catch (Exception ex) {
}
System.out.println(Thread.currentThread().getName()+ "...剩余票数:"
+tick--);
}
}
}