黑马程序员_多线程

--------------------- <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");
}
}
}

public static void main(String[] args) {

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");
}
}

public static void main(String[] args) {
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>、期待与您交流! ----------------------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值