java多线程基础

 

多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要。

一、什么是线程

线程是程序执行的最小单元,一个程序最少有一个线程。

一个应用也是一个线程,主方法是他的主线程,一个程序运行时会有最少两个线程,主线程和gc。

二、线程的三种状态

新建 new,new出一个线程处于新建状态。

就绪 runnable,start()进入就绪状态,开始准备抢占cpu资源。

运行 running,cpu正在执行线程。

阻塞 blocked,等待阻塞wait(),同步阻塞sync失败,其他 seleep()、join()。

死亡 dead,线程run结束或者因为异常退出。

借鉴一下比较经典的线程的生命周期图。

 三、如何创建一个线程

(1)继承thread类

继承thread类要重写run()方法,通过调用start()方法启动线程。

(2)实现runnable接口

实现接口要实现run()方法,然后定义一个线程A,把该实现类作为线程A构造方法的参数,A.start()启动线程。

 start()方法在启动线程的时候会调用run(),还会调用start0(),用来调度cpu资源, 另外 Thread类也是实现run方法的。

区别:推荐使用实现runnable接口,一是由于不受java单继承多实现的限制,二是方便实现数据共享。

 

package com.peoplemanager;

public class Demo1 {
    public static void main (String args[]){
        //第一种方式
        Thread t1 = new MyThread();
        Thread t2 = new MyThread();
        Thread t3 = new MyThread();
        t1.start();
        t2.start();
        t3.start();
        //第二种方式
        MyThreadImpl mt = new MyThreadImpl();
        new Thread(mt).start();
        new Thread(mt).start();
        new Thread(mt).start();
    }
}
class MyThreadImpl implements Runnable{
    private int ticket = 5;
    public void run(){
        synchronized (this) {
            for(int i=20;i>=5;i--){
                if(ticket>0){
                    try {
                        MyThread.sleep(100);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println(ticket--);
                }
            }
        }
    }
}
class MyThread extends Thread{
    private  int ticket = 5;
    public void run(){
        synchronized (this) {
            for(int i=20;i>=5;i--){
                if(ticket>0){
                    try {
                        MyThread.sleep(100);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println(ticket--);
                }
                
            }
        }
    }
}

 

四、同步和锁

实现同步的方式:加锁,将代码卸载sync(){}代码块中,锁住了,别的线程不能运行,只能等他先运行完。

多个线程访问同一资源要考虑线程的同步,同步会影响程序的性能,但是会提升数据的安全性,过多的同步有可能出现死锁。

 

五、线程安全

java容器实现线程安全的两种思路:

 

posted @ 2019-06-09 15:39  你又来写博客了  阅读(219)  评论(0)    收藏  举报