java线程

来源:互联网 发布:服务器默认端口号 编辑:程序博客网 时间:2024/06/05 10:34

一、对于线程的理解

一个线程对应的是一个实例化的线程类对象,初始化一个线程类,就创建了一个线程,当多个线程同时对某一个对象或内存进行操作时,才会考虑线程的同步

二、线程的创建方法

(1)继承Thread类,并重写run()方法

(2)实现Runnable接口,重写run()方法,然后将该实现类的对象,做为Thread类的初始化参数来创建Thread对象,该Thread对象才是真正的线程对象,调用start()方法启动线程

                RunnableThreadTest rtt = new RunnableThreadTest();                  new Thread(rtt,"新线程1").start();                  new Thread(rtt,"新线程2").start();  

(3)使用Callable和FutureTask创建线程

编写一个类,实现Callable类,重写call方法,实例化该实现类,作为FutureTask类实例化的参数,然后将FutureTask的实例化对象作为线程类的实例化对象的参数

package com.thread;    import java.util.concurrent.Callable;  import java.util.concurrent.ExecutionException;  import java.util.concurrent.FutureTask;    public class CallableThreadTest implements Callable<Integer>  {        public static void main(String[] args)      {          CallableThreadTest ctt = new CallableThreadTest();          FutureTask<Integer> ft = new FutureTask<>(ctt);          for(int i = 0;i < 100;i++)          {              System.out.println(Thread.currentThread().getName()+" 的循环变量i的值"+i);              if(i==20)              {                  new Thread(ft,"有返回值的线程").start();              }          }          try          {              System.out.println("子线程的返回值:"+ft.get());          } catch (InterruptedException e)          {              e.printStackTrace();          } catch (ExecutionException e)          {              e.printStackTrace();          }        }        @Override      public Integer call() throws Exception  37.    {  38.        int i = 0;  39.        for(;i<100;i++)  40.        {  41.            System.out.println(Thread.currentThread().getName()+" "+i);  42.        }  43.        return i;  44.    }  45.  46.}  

三种方法对比:继承Thread类对象不能再继承其他的类,拓展性不好,使用接口的形式比较复杂

三、线程的状态

新建状态:new Thread(),则线程就进入新建状态

就绪状态:t1.start();启用start方法之后,线程就进入就绪状态,等待cpu分配资源

运行状态:runing,调用run方法,

死亡状态:当run方法结束,调用stop方法让一个线程中止运行

堵塞状态:

yield()方法,线程进行让步

调用sleep(long time)方法,线程会进入休眠状态,时间结束后自动进入就绪状态

等待方法,调用wait方法,要想进入到就绪,则使用notify()方法或者notifyAll()方法

被另一个线程所阻塞,调用suspend()方法,调用resume()方法,进入就绪

四、常用方法

Thread.start();

Thread.run();

Thread.joyin((long millis);让一个线程等待另一个线程

Thread.yield();线程进入阻塞状态

Object.wait();

Thread.sleep();

五、线程的优先级

Thread t2 = new MyThread();  

t2.setPriority(Thread.NORM_PRIORITY+3);   

六、yield和sleep的区别

sleep给其他线程机会时不会考虑线程优先级,yield只会给同级或者比他高的优先级线程让步,

sleep是让线程进入到阻塞状态,结束时间之后才会进入就绪状态,而yield方法是将线程进入就绪状态,完全有可能刚进入就绪状态的线程又立马被调用

sleep声明和抛出InterruptedException异常,而yield没有异常

sleep有更好的移植性,通常不建议使用yield处理并发线程执行

六、多线程和死锁

使用synchronized关键字