黑马程序员--------------多线程

来源:互联网 发布:linux切换输入法 编辑:程序博客网 时间:2024/05/12 22:08
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、进程与线程

一个进程就是一个应用程序,一个进程里面有多个线程。

进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大的提高了程序运行效率。

二、多线程的实现方式 继承Thread类

        1.代码格式

class 类名 extends Thread{
方法1;
方法2
public void run(){
   //需要多线程执行代码。
}
}
2.start()与run()方法的区别?

    start()1.开启线程,2开启的线程执行run方法。

    run()  没有开启线程,主线程执行run方法。

 三、程序运行状态图    

           

           什么时候结束线程,只有run()方法结束了,当前线程就结束了。

四、多线程的实现方式 实现接口Runnable

    1. 实现Runnable接口,然后用new Thread(实现Runnable接口的类的对象)来产生一个线程类。

class 类名 implements Runnable{
方法1;
方法2
public void run(){
// other code…
}
属性1
属性2
}
代码实例

   class Tick implements Runnable{ private int sum = 100 ; private Object o = new Object(); public void run() {  while(true)  {   synchronized (o){   if(sum>0)   {    try{     Thread.sleep(1);         } catch ( InterruptedException e){     new RuntimeException("不认识您");    }    System.out.println(Thread.currentThread().getName()+"----------"+sum--);   }  else    break;        }  } }}public class ThreadDemo { public static void main(String[] args) {  Tick t = new Tick();  Thread t1 = new Thread( t );  Thread t2 = new Thread( t );  Thread t3 = new Thread(new Tick());  Thread t4 = new Thread(new Tick());  t1.start();  t2.start(); }}
 


五、ThreadRunnable的区别:
    1.避免了但继承的局限性,
    2.如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。
    3.降低了耦合性,提高了代码了扩展性。
六、多线程的安全问题
    1.线程任务中有处理的共享数据,
    2.线程任务中有多条对共享数据的操作。
如何解决?
只要保证共享数据的代码在某一时间段,只能被一条线程所执行,在执行期间不允许其他线程参与运算。
可以使用同步函数,同步代码块。
好处:解决了多线程的安全问题,
弊端:降低了效率。
七、同步函数使用的锁(this)和static同步函数的锁是(类名.class)
 同步函数和同步代码块的区别.
 同步函数使用固定的锁this。同步代码块可以使用任意对象的锁。

class SaleTicks implements Runnable{ private int tick = 1000; public boolean falg = true; public  void run(){  if(falg){   while( true )   {    synchronized (this)    {        if( tick>0 )     {         try{          Thread.sleep(1);         } catch ( InterruptedException e) {          new InterruptedException(" ---------");         }      System.out.println(Thread.currentThread().getName()+"---fun00---"+tick--);     }       }   }  }else{   while(falg==false)      sale();  } } public synchronized void sale(){   if( tick>0 )   {    try{        Thread.sleep(5);       } catch ( InterruptedException e) {        new InterruptedException(" ---------");       }    System.out.println(Thread.currentThread().getName()+"---222---"+tick--);   } }}public class ThisLockDemo { public static void main(String[] args) throws InterruptedException{  SaleTicks st = new SaleTicks();  Thread t1 = new Thread(st);  Thread t2 = new Thread(st);  t1.start();  Thread.sleep(10);  st.falg = false;  t2.start(); }}


八、线程池
1、线程池作用就是限制系统中执行线程的数量。
根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;如果线程少了会浪费系统资源,多了又会造成系统拥挤效率不高。用线程池控制线程数  量,使得其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有任务等待进程,则线程池中的线程处于等待。
2、、为什么要用线程池
减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。也可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。
3、线程池的原理
其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当客户端有一个新请求时,就会唤醒线程池中的某一个睡眠线程,让它来处理客户端的这个请求,当处理完这个请求后,线程又处于睡眠状态。

0 0
原创粉丝点击