--------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
一.线程的概念
1.什么是线程进程:当前正在执行的程序,代表一个应用程序在内存中的执行区域。
线程:是进程中的一个执行控制单元,执行路径。
2.多线程的应用:如迅雷下载.QQ等
3.CPU执行原理:每个程序随机交换执行,cpu切换速度非常的快,貌似是在同时执行很多程序,其实不是,只是切换的太快我们感觉不出
二新线程的开启:有两种方式
1.继承Threada,定义一个类继承Thread类
class MyThread extends Thread{ //继承Thread类
public void run(){ //重写run方法,将要执行的代码放在run方法里
for (int i = 0; i < 1000; i++) {
System.out.println("aaa");
}
}
}
final Thread td = new Thread(); //创建Thread类子类对象
td.start(); //调用start方法让其执行run方法里的代码
2.实现Runnable:如
class MyThread1 implements Runnable{ //a,定义一个类实现Runnable接口
@Override
public void run() {b,重写run方法,将要执行的代码放在run方法里
for (int i = 0; i <1000; i++) {
System.out.println("cccc");
}
}
final Thread td = new Thread(new Runnable(){ //只有Thread的子类才能开启线程,所以把Runnable的子类对象传进Thread子类中
@Override
public void run() {
for (int i = 0; i < 5; i++) {
/*try {
Thread.sleep(1000); //sleep方法
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
System.out.println(Thread.currentThread().getName()+"vvv");
}
}
});
td.setName("张三");
td.start();
3.两种方式的区别
(1)继承的代码简单
(2)继承是单继承,实现可以多实现
继承了Thread这个类后就不能在继承别的类,如果你这个本身就有父类这个方法就行不通,就必须用第二种,如果你定义的类不需要继承任何类,建议用第一种,因为代码简单,是Thread的子类,他里面的方法可以直接用.
三.Thread类的一些常用方法
1.设置名字
(1)通过构造函数直接初始化名字
(2)通过setName(String)方法设置线程的名字
2.获取名字
getName()获取当前线程的名字
3.获取当前线程对象
Thread.currentThread()获取当前线程的引用
4.休眠
Thread.sleep(int)当时间到的时候,线程继续执行
5.守护
setDaemon(true);将线程设置为守护线程,守护线程的特点是,当非守护线程执行完了,守护线程即使没执行完,也会终止,因为有时间的缓冲,所以可能还会再多执行
几句
6.加入
join()加入到另个线程中,相当于插队,加入的这个线程执行完,再执行被加入的线程
四.线程之间的同步
1当多条线程访问到多条语句的时候,而且多条语句还要同时输出,这个时候我们就让CPU给点时间,让多条要一起执行的语句执行完,再切换走这个情况下就要用同步
2.synchronized(任意对象){},将需要同步的代码放在同步代码块的大括号里
3.在方法上加上synchronized锁关键字即可,同步方法的锁是,如果是非静态的,锁是this,如果是静态的,锁是类名.class也就是字节码文件
4.死锁问题
当同步代码块嵌套的时候很容易出现死锁,最好掌握一个死锁,有可能出现面试题
代码如下:
public class DeadLockDemo {public static void main(String[] args) {
DeadLock dl1 = new DeadLock(false);
Thread t1 = new Thread(new DeadLock(true));
Thread t2 = new Thread(new DeadLock(false));
t1.start();
t2.start();/**/
/*Thread dl = new DeadLock(true);
Thread d2 = new DeadLock(false);*/
}
}
class DeadLock extends Thread{
private boolean flag;
DeadLock(boolean flag) {
super();
this.flag = flag;
}
@Override
public void run() {
if (flag) {
while(true){
synchronized (LockName.lock1) {
System.out.println("AAA");
synchronized (LockName.lock2) {
System.out.println("aaa");
}
}
}}else{
while(true){
synchronized (LockName.lock1) {
System.out.println("BBB");
synchronized (LockName.lock2) {
System.out.println("bbb");
}
}
}
}
}
}
class LockName{
static LockName lock1 = new LockName();
static LockName lock2 = new LockName();
}
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------