java多线程基础知识

来源:互联网 发布:设置截图路径 mac 编辑:程序博客网 时间:2024/06/05 23:55

  在不是多线程的情况下,任务是一个一个执行的,然而当我们使用多线程的时候,cpu便允许单个程序创建多个并行执行的线程来完成各自的任务,这样也就可以提高CPU的利用率。来初步认识下java中的多线程:

1、  java中的线程类继承自java.lang.Thread或者其子类,Thread的构造函数有四个:

1、Thread();
2、Thread(String name);
3、Thread(Runnable target);
4、Thread(Runnable target,String name);

其中name是线程的名字,target是实现了Runnable接口的对象


2、线程类有以下成员函数:

1、void start();                                                         //启动线程
2、static void sleep(long millis);                              //线程休眠millis毫秒 ,让给其他任意优先级的线程
3、static void sleep(long millis,int nanos);              //millis毫秒naos纳秒线程休眠
4、void join();                                                         //开始当前线程使其他线程停止直到当前线程终止
5、void join(long millis);                                         //开始当前线程使其他线程停止直到当前线程终止或者过去了millis毫秒
6、void join(long millis,int naonos);                      //同上 只不过其他线程的等待时间变成millis毫秒 naosos纳秒

7、static void yield();                                            //当前运行线程释放处理器资源,让给其他大于等于自己优先级的线程
8、static Thread currentThread();                         //返回当前运行线程的引用

注意:sleep方法和yield方法都会暂停当前线程,但是sleep方法会将资源让给其他线程而不关心它的优先级,但是yield方法则是让给大于等于自己优先级的线程;

          sleep方法会将当前线程转入阻塞状态,直到阻塞之后才进入就绪状态,然而yield则是使当前线程直接进入就绪状态;

          sleep方法会抛出InterruptedException异常,而yield不会异常;

3、synchronized关键字          

synchronized关键字的作用是对一个对象或者是方法(其实还是持有这个方法的对象)加上锁,加锁实质上是取得对象的访问权限,如果对象已经被其他者所加锁,那么请求者就只好进入等待队列(休眠),知道被其他线程使用notify方法唤醒。在被加锁的代码块当中,可能会出现一些情况,使得代码需要一些条件才能继续运行,此时为了让这个代码块能够被其他的线程执行到,必须释放锁,notify方法除了唤醒其他的线程,并把锁交给它之外还有释放锁+让自己休眠的作用。(notify在下面会介绍)

4、同步与互斥的代码实现       

public class ThreadTest{ private final Object lockObj=new Object();   //定义一把锁 public void todo(){  synchronized(this){     //java使用synchronized关键字来实现互斥   while(阻塞的条件){    //在这里阻塞的线程都会进入等待队列   try{    lockObj.wait();//条件不满足时都会被阻挡 而不是竞争资源   }   catch(InterruptedException e){    e.printStackTrace();   }}     //这里写上要进行的互斥代码   ...   lockObj.notifyAll();//唤醒所有等待的线程 通知其他线程可以来竞争资源了   }}}
注意:wait()/notify()/notifyAll();这些都是Object的成员函数 而不是Thread的成员函数




原创粉丝点击