---------------------------------------- android培训、java培训、期待与您交流! ------------------------------------
不是所有的语言都支持多线程,JAVA是支持多线程的语言之一
进程:正在进行中的程序(直译),进程就是对应一个应用程序在内存空间所属的空间。
windows有windows的内存空间,java有java的内存空间。
windows操作系统中,任务管理器中里面的,exe进程就是正在进行的程序。
线程:就是负责进程中内容执行的一个控制单元,也称为执行路径。一个进程中可以有多个执行路径(控制单元),所以称之为多线程
一个进程至少有一个线程 当我们想让多部分代码同时执行,我们就用多线程每一个线程都有自己要执行的任务,<多线程的好处与弊端:CPU执行是随机切换的,切换的速度非常的快,如果程序开多了还是会慢,因为抢不到执行权。
多线程的好处:
解决了多个程序同时执行。
弊端:线程太多导致效率的降低。JVM中的线程:JVM启动时就启动了多条线程至少有两个线程:Main线程、垃圾回收线程
主线程在执行的过程中,垃圾回收期也会在不定时地来回收垃圾。创建线程的两种方式:
1.继承Thread类,重写run()方法;run()方法就是封装自定义线程的函数。
2.实现Runnable接口。推荐使用第二种,比较符合面向对象的特征。
线程状态图:
卖票事例:
<span style="font-family: Arial, Helvetica, sans-serif;">package thread;</span>
public class TicketDemo implements Runnable {
public int num = 100;
private Object obj = new Object();
@Override
public void run() {
sale();
}
public void sale() {
while (true) {
synchronized (obj) {
if (num > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ " sale ....." + num--);
}
}
}
}
public static void main(String[] args) {
TicketDemo ticket = new TicketDemo();
Thread t1 = new Thread(ticket);
Thread t2 = new Thread(ticket);
Thread t3 = new Thread(ticket);
t1.start();
t2.start();
t3.start();
}
}
synchronized(Object){}同步代码块:
synchronized主要用来处理线程安全的,Object对象相当于一个锁,一个线程进入同步代码块中后,其它线程处了临时堵塞状态,无法执行,必须要等同步代码块中的数据执行完毕后,然后释放了锁,下一条线程才可以进入。
比喻:火车上的厕所,当人进入的了厕所,厕所旁边的灯显示有人,其他人就无法进入了,非得你方便完以后开门出去,显示无人,其他人才能进入。
同步的好处与弊端
好处:解决了线程安全问题。
弊端:效率低,因为同步外的线程都会判断同步锁。
同步的前提:
多个线程使用的是同一把锁。要想多个线程使用同一把锁,需要把锁的对象放在成员变量中,几条线程共享着同一把锁
同步函数事例:
同步函数的锁是this;静态同步锁使用的是.getClass()字节码对象.
同步代码块的锁是任意的对象;
建议使用代码块;
package thread;
/**
* 两个储户,每个月每张卡存100,存3次
* @author liujie
*
*/
class Bank {
private int sum;
public synchronized void add(int num) {
sum += num;
System.out.println("sum=" + sum);
}
}
class Cus implements Runnable {
private Bank bank = new Bank();
@Override
public void run() {
for (int i = 0; i < 3; i++) {
bank.add(100);
}
}
}
public class BankTest {
public static void main(String[] args) {
Cus cusTest = new Cus();
Thread t1 = new Thread(cusTest);
Thread t2 = new Thread(cusTest);
t1.start();
t2.start();
}
}
死锁:常见的情况之一,同步的嵌套,A拥有B的锁,B拥有A的锁,程序表现方式,同步代码块中嵌入同步函数this锁,同步函数中嵌入同步代码块锁。
死锁Code:
package thread;
public class DeadLoockDemo {
public static void main(String[] args) {
Ticket1 tt = new Ticket1();
Thread t1 = new Thread(tt);
Thread t2 = new Thread(tt);
t1.start();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
tt.flag = false;
t2.start();
}
}
class Ticket1 implements Runnable {
private int num = 100;
public boolean flag = true;
private Object obj = new Object();
@Override
public void run() {
if (flag) {
while (true) {
synchronized (obj) {
show();
}
}
} else {
while (true) {
show();
}
}
}
public synchronized void show() {
synchronized (obj) {
if (num > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ "同步方法嵌入同步代码块" + num--);
}
}
}
}
---------------------------------------- android培训 、 java培训 、期待与您交流! ------------------------------------