黑马程序员--Java多线程

来源:互联网 发布:域名注册是永久的吗 编辑:程序博客网 时间:2024/06/02 04:15

一、Java多线程的基本知识

进程是指正在进行中的程序。其实进程就是一个应用程序运行时的内存分配空间。

线程是指进程中独立的运行单元,一个进程中至少有一个以上的线程。

Jvm启动时一般会有一个主线程,负责main方法里程序的执行,主程序执行的代码都在main方法里。Jvm在启动的时候会有多个线程在执行,除了主线程还有负责垃圾回收等功能的线程在执行。

二、创建线程的两种方式

第一种是继承Thread类。

主要步骤如下:

1.创建一个集成Thread的类。

2.重写Thread里的run方法。

3.在run方法里面写需要在线程里执行的程序。

下面就是一个线程的例子

package itheima.mythread;

public class MyThread extends Thread{

    //创建线程的第一种方式:继承Thread类。

    @Override

    public void run(){

       System.out.println("第一个线程!");

       while(true){

           System.out.println(Thread.currentThread().getName()+"正在运行!");

       }

    }

    public MyThread(){}

    public MyThread(String name){

       super(name);

    }

    public static void main(String[] args){

       //正常的写法

       MyThread my=new MyThread();

       my.start();

       my.setName("第一个线程!");

      

 

       //简化的写法

       new Thread(){

           public void run()

           {

              System.out.println("简化的线程!");

           }

       }.start();

       while(true){

           System.out.println("main方法线程:"+Thread.currentThread().getName());

       }

    }

}

创建线程的第二种方式是实现Runnable接口。步骤如下:

1.定义实现Runnable接口的类。

2.在类中实现Runnable接口的run方法。

3.在方法里面定义需要在线程里实现的代码。

下面的例子就是通过实现Runnable接口来创建一个线程:

package itheima.mythread;

public class MyThread2 implements Runnable{

    //线程的第二种方法,实现runnable接口

    public static void main(String[] args){

       MyThread2 mythread=new MyThread2();

       Thread thread=new Thread(mythread);

       thread.start();

       //简单的实现

       new Thread(new MyThread2(){

           public void run(){

              System.out.println("使用匿名内部类简化格式!");

           }

       }).start();

    }

 

    @Override

    public void run() {

       // TODO Auto-generatedmethod stub

       System.out.println("实现Runnable的线程!");

    }

}

通过实现Runnable接口可以避免Java单继承的局限性。实现方式和继承方式的区别:

1.继承Thread:线程代码存放在 Thread子类 run方法中

2.实现Runnable:线程代码存放在接口的子类的 run方法中

建议使用第二种线程创建方法。因为第二种方式更加体现面向对象思想。

三、线程的状态与安全性

1.线程间的通讯

线程间通信-等待唤醒机制:

wait(),notify(),notifyAll(),都使用在同步中,因为要对持有监视器(锁)的线程操作。

为什么这些方法都定义在Object类中:

因为这些方法在操作同步中线程时,都必须要标识他们所操作线程只有的锁,只有同一个锁上的被等待线程,可以被同一个锁上notify唤醒,也就是说,等待和唤醒必须是同行一个锁调用的方法定义object类中。

wait方法和sleep方法的区别:wait是释放资源释放锁,sleep是释放资源不释放锁。

同步代码块和同步方法的区别:同步代码块使用的锁可以是任意对象,同步方法使用的锁是当前对象,静态方法同步的锁是该类的字节码文件对象,静态方法在加载时所属于类,这时有可能还没有该类产生的对象,但是该类的字节码文件加载进内存就已经被封装成了对象,这个对象就是该类的字节码文件对象。

JDK1.5中,提供了许多线程解决方案,将同步synchrozed替换成显示 Lock操作,Lock 替代了 同步synchronized方法和语句的使用,提供了显示的锁机制方法。

void lock();获取锁

void unlock();释放所

Object中的 wait ,notify,notifyAll,替换成了condition对象。 该对象可以Lock锁,进行获取。

如何停止线程:

1.加入循环,循环结束,线程就技术。

2.使用interruput()方法强制中断循环。

Join():当A线程执行到了B线程的.Join()方法时,A线程就会让出CPU执行权,等待直到B线程执行完,A才会执行。Join可以用来临时加入线程执行。

优先级:线程对象.setPriority(intnewPriority);设置线程优先权,1-10,线程执行权越大在CPU中就优先执行(Thread.MAX_PRIORITY, MIN_PRIORITY ,NORM_PRIORITY)。

staticvoidyield():暂停当前正在执行的线程,并执行其他线程,Thread.yield();

 

 

 


 

 

 

0 0
原创粉丝点击