线程

来源:互联网 发布:portraiture mac 编辑:程序博客网 时间:2024/06/05 00:42


线程
并发:同时执行
线程:共享进程资源
同步:步调一致的顺序执行
异步:步调不一致的同时执行

线程(Thread)
---->run()方法:独立运行的过程
---->start():启动run()

过程:
1.创建一个线程
2.覆盖run()方法,并提供独立的运行过程
3.调用Thread实例的start()方法,启动run()方法

线程状态:
            start()
new Thread()----->可运行态Runnable----->运行态Running----->结束状态Dided
                        |                    |
               |                    |
                <--- block阻塞<-----
      
线程结束后,不可返回新建状态,只可进行垃圾回收,不可Start()。stop()方法不安全,不推荐使用
      
Thread.yield():出让当前处理器(离开Running),变为可运行态Runnable.

Thread.sleep(times):使当前由Running让出处理器,进入block状态,休眠times毫秒,返回到Runnable状态。
                    如果其他线程打断当前线程(Block)的执行,会发生异常InterruptedException().
  Thread实例的t.interrupt();方法会使t实例产生异常。
package ThreadDemo;

public class Demo {

 public static void main(String[] args) {
  Thread t=new Thread(){
   public void run() {
    for(int i=0;i<10;i++){
     System.out.println("睡觉呢");
     try {
      sleep(1000);
     } catch (InterruptedException e) {
      //e.printStackTrace();
      System.out.println("干嘛呢,破相了");
     }
    }
   };
  };
  t.start();
  System.out.println("砸墙");
  for (int i = 0; i < 5; i++) {
   try {
    Thread.sleep(500);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  t.interrupt();
  System.out.println("墙穿了");
 }

}
     
后台线程(守护线程,精灵线程):Thread.setDaemon(true)将线程设置为后台线程。

进程的结束:当前前台线程全部结束,Java进程结束。后台进程,不管是不是结束,都会停掉。

线程的优先级:默认有10级优先级,优先级高的线程获得的执行机会多,机会的多少不能通过代码干预。
              默认优先级为5 Thread.setPriority(Thread.MAX_PRIORITY);设置为最高级10.

创建线程的方法:
               1.覆盖Thread类
      2.实现Runnable()接口
        a.实现Runnable()接口,实现run()方法,提供并发运行的过程。
     b.创建这个类的实例,用这个实例作为Thread构造器的参数,创建Thread类
     c.使用start()方法启动
      3.使用内部类或匿名类
  new Thread(){
   public void run() {
    for(int i=0;i<100;i++){
     System.out.println("Hi");
    }
   };
  }.start();
  
  new Thread(new Runnable() {
   @Override
   public void run() {
    for(int i=0;i<100;i++){
     System.out.println("Bye");
    }
   }
  }).start();

业务中写日志是写到内存数组中,再起一线程有数组写入文件。

线程同步 synchronized
多个线程并发读写同一个线程资源时会发生线程安全问题
可以使用同步代码块解决问题,同步解决读写问题,解决并发问题

1.方法同步:加在方法前
2.代码块同步:加在代码块上
同步监视器是一个任意对象实例,是多线程之间互斥的锁操作,多个线程要使用同一个“监视器”
    Object mutex=new Object();
 synchronized (同步监视器) {//可以使用synchronized (this) 即当前类
 ...//需同步的代码块
 }
 
Java的同步API
StringBuffer,Vector,HashTable同步的
StringBuilder,ArrayList,HashMap不同步的
Collections.synchronizedList():转同步,集合包裹
 
异步线程之间,协作通信
异步写文件:
 创建读线程,创建写线程,创建缓冲数组
 
wait()与notify()异步等待及唤醒

Timer定时器
package ThreadDemo;

import java.util.Timer;
import java.util.TimerTask;

public class TimerDemo {

 public static void main(String[] args) {
  final Timer t=new Timer();
  t.schedule(new TimerTask() {//10ms中以后,每隔50ms执行run()方法
   int i=60;
   @Override
   public void run() {
    System.out.println("还有:"+i--);
    if(i==0){
     t.cancel();//结束线程
     System.out.println("我还会回来的");
    }
   }
  }, 10, 50);
 }

}

原创粉丝点击