首页 > 代码库 > java线程

java线程

进程:计算机在执行的程序的实体 例如:一个.exe文件,一个.class文件

线程:一个程序内部的顺序控制流

一个进程中可以包含一个或多个线程,一个线程就是一个程序内部的一条执行线索。

进程和线程的区别

1.每个进程都有独立的代码和数据空间,进程的切换或有很大的开销。

2.同一类线程共享代码和数据空间,每个线程有独立运行的栈和程序计数器,线程切换开销小。

多进程:在操作系统中能同时运行多个任务。

多线程:在同一个应用程序中有多个顺序同时执行。

 

多线程的实现

(1)创建线程类:

    1.继承Thread类

    2.实现Runnable接口

(2)通过Thread类构造器来创建线程对象

    1.Thread()

    2.Thread(Runnable target)

(3)通过start()方法激活线程对象

继承Thread类:

覆盖run()方法

public class ThreadDemo  extends Thread{
    @Override
    public void run() {
        for (int i=0;i<10;i++){
            System.out.println("Thread"+i);
        }
    }

    public static void main(String[] args) {
        ThreadDemo threadDemo=new ThreadDemo();
        threadDemo.start();
    }
}

实现Runnable接口

线程共享同样的数据和代码,覆盖Runnable接口中的唯一的方法run()

 1 public class RunnableDemo implements  Runnable {
 2     @Override
 3     public void run() {
 4         for (int i=0;i<10;i++){
 5             System.out.println("Thread"+i);
 6         }
 7     }
 8 
 9     public static void main(String[] args) {
10         RunnableDemo runnableDemo=new RunnableDemo();
11         Thread thread=new Thread(runnableDemo);
12         thread.start();
13     }
14 }

 

线程的状态及生命周期

 

技术分享

start():使线程处于可以运行的状态,但不一定意味着该线程立即开始执行。

 

 线程中主要的方法:

 

技术分享

 

线程的休眠:

  sleep():让线程终止一段时间的静态方法;Thread.sleep(long millis)------暂停执行millis毫秒;在睡眠起满的瞬间,再次调用该线程不一定会恢复它的执行。

  join():导致当前线程等待,知道调用这个join方法的线程终止,

  yield():为其它可运行的线程提供执行机会;静态方法----Thread.yield

线程的中断

  自动终止:一个线程执行完成后,不能再次执行。

  手动终止:

    stop()

    interrupt()

    可通过使用一个标志指示run方法退出。

    

 1 public class Runner implements Runnable {
 2     private boolean timeToQuit=false;
 3     @Override
 4     public void run() {
 5         while(!timeToQuit){
 6 //            …………
 7         }
 8     }
 9     public void stopRunning(){
10         timeToQuit=true;
11     }
12     private  Runner runner=new Runner();
13     private  Thread thread=new Thread(runner);
14 
15     public void starThread(){
16         thread.start();
17     }
18     public void stopThread(){
19         runner.stopRunning();
20     }
21 }

 

线程的高级操作

  void wait():导致当前的线程等待,直到其它线程调用此对象的notify()方法会notifyAll()方法。

  void notify():唤醒在此对象监视器上等待的单个线程。

  void notifyAll():唤醒在此对象监视器上的所有线程。

线程同步

  为线程添加线程锁

  锁定方法:synchronized void method(){}

  锁定代码块:synchronized(Object){}

一旦一个包含锁的线程被cpu调用,其它线程就无法调用相同对象的锁定方法。当一个线程在一个锁定方法内部,所有试图调用该方法的同实例的其它线程必须等待。

同步方法

 1 public class Testsync implements Runnable {
 2     Timer timer=new Timer();
 3     @Override
 4     public void run() {
 5         timer.add(Thread.currentThread().getName());
 6     }
 7     public static void main(String[] args) {
 8         Testsync testsync=new Testsync();
 9         Thread thread1=new Thread(testsync);
10         Thread thread2=new Thread(testsync);
11         thread1.setName("1");
12         thread2.setName("2");
13         thread1.start();
14         thread2.start();
15     }
16 }
 1 public class Timer {
 2     private static int num=0;
 3     public synchronized void add(String name){
 4         num++;
 5         try{
 6             Thread.sleep(1);
 7         }catch (Exception e){
 8 
 9         }
10         System.out.println(name+"你是第"+num+"个线程");
11     }
12 }

同步代码快

 1 public class Testsync implements Runnable {
 2     Timer timer=new Timer();
 3     @Override
 4     public void run() {
 5         timer.add(Thread.currentThread().getName());
 6     }
 7     public static void main(String[] args) {
 8         Testsync testsync=new Testsync();
 9         Thread thread1=new Thread(testsync);
10         Thread thread2=new Thread(testsync);
11         thread1.setName("1");
12         thread2.setName("2");
13         thread1.start();
14         thread2.start();
15     }
16 }
 1 public class Timer {
 2     private static int num = 0;
 3 
 4     public void add(String name) {
 5         synchronized (this) {
 6             try {
 7                 Thread.sleep(1);
 8             } catch (Exception e) {
 9 
10             }
11             System.out.println(name + "你是第" + num + "个线程");
12         }
13     }
14 }

注意:受到synchronized保护的程序代码快和方法中,要访问的对象属性必须设定为private,因为如果不设定为private,那么就可以用不同的方法来访问它。

java线程