Thread-概念和实例

来源:互联网 发布:网络视频下载器有那些 编辑:程序博客网 时间:2024/06/05 03:44

概念

一、线程:Thread

进程:    正在进行的程序,是系统进行资源分配和调度的一个独立单位,拥有独立的内存空间和系统资源多进程:  多个程序在运行线程:    就是进程中一个负责程序执行的控制单元。多线程:  一个进程中可以有多个执行路径 称为多线程。多线程就是最大化的提高CPU的利用率,它可与同属一个进程的其他的线程共享进程所拥有的    全部资源.其他:一个进程当中至少要有一个线程。开启多个线程,是为了同时运行多个任务每一个线程都有自己运行的内容,这个内容可以称为线程要执行的任务

二、创建线程

    线程执行需要拥有CPU,如果线程未获得CPU则该线程处于等待状态    1.继承: Thread    2.重写:run    3.创建线程对象    4.启动:start()-->其实就是执行run方法,但是不一定会立马执行,只有等当前线程获得CPU执行权才会真正执行

通过实现接口创建线程
1.实现接口:java.lang.Runnable
2.重写方法:run
3.创建线程对象:
Thread t = new Thread(实现接口的对象)
4.启动线程:start()


三、线程的生命周期

        新生状态:线程对象被创建出来    可运行状态:线程处理装备转换,只是缺少CPU执行权        start()    运行运行状态:    阻塞状态:线程处于等待状态,并且释放CPU执行权        sleep():等待状态,并且释放CPU执行权        wait():等待状态,拥有CPU执行权    死亡状态:线程结束        stop()        run方法执行结束

四、同步:多线程访问同一份资源所产生的冲突

synchronized
1.代码块
任何一对象都有锁功能
synchronized(锁对象){
//执行的代码
}

2.方法:在方法前加synchronized
a.非静态方法的锁对象是当前类对象
b.静态方法的锁对象是当前字节码文件对象


五、线程同步的面试题

    StringBuilder:非线程安全    StringBuffer:线程安全    ArrayList:非线程安全    Vector:线程安全    HashMap:非线程安全    Hashtable:线程安全

实例

sleep阻断

package com.ibeifeng;public class Demo {    public static void main(String[] args) {        InterruptThread1 it = new InterruptThread1();        it.start();//it线程启动,会被阻塞100秒,然后运行        it.interrupt();//调用中断方法,会结束阻塞状态,抛出中断异常    }}class InterruptThread1 extends Thread {    public InterruptThread1() {}    @Override    public void run() {        try {            System.out.println("线程"+getName()+"准备睡20秒,再运行");            sleep(20000);        } catch (InterruptedException e) {            System.err.println("阻塞状态,中断信号");        }        for(int i=0; i<100; i++) {            System.out.println(getName()+"正在运行中。。。");        }    }}

设置优先级

package com.ibeifeng;public class PriorityDemo {    public static void main(String[] args) {        MyThread mt1 = new MyThread("aaa");        MyThread mt2 = new MyThread("bbb");        MyThread mt3 = new MyThread("ccc");        //设置优先级        mt1.setPriority(Thread.MAX_PRIORITY);        mt2.setPriority(Thread.MIN_PRIORITY);        mt3.setPriority(Thread.NORM_PRIORITY);        mt1.start();//注意和run()的区别        mt2.start();        mt3.start();    }}//1继承Threadclass MyThread extends Thread {    public MyThread(String name) {        super(name);    }    @Override    public void run() {        for(int i=0; i<10; i++) {            try {                sleep(2000);            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            System.out.println(getName()+":,"+getPriority()+","+i);        }    }}

join

package com.ibeifeng;public class JoinDemo {    public static void main(String[] args) {        JoinThread jt = new JoinThread();        //创建3条线程        Thread t1 = new Thread(jt);        Thread t2 = new Thread(jt);        Thread t3 = new Thread(jt);        //运行        t1.start();        //join方法        try {            t1.join();        } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        t2.start();        t3.start();    }}class JoinThread implements Runnable {    @Override    public void run() {        for (int i = 0; i < 10; i++) {            System.out.println(Thread.currentThread().getName()+":"+i);        }    }}

中断方法

package com.ibeifeng;public class InterruptDemo {    public static void main(String[] args) {        InterruptThread it = new InterruptThread("旺财");        it.start();        //调用中断方法        it.interrupt();    }}class InterruptThread extends Thread {    public InterruptThread(String name) {        super(name);    }    @Override    public void run() {        System.out.println("休息100秒");        try {            sleep(100000);        } catch (InterruptedException e) {            System.err.println("抛出终端异常");        }        for(int i=0; i<10; i++) {            System.out.println();        }    }}

客户端服务器交互

客户端

package com.ibeifeng3;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.Socket;import java.net.UnknownHostException;public class ClientDemo {    public static void main(String[] args) {        try {            test1();        } catch (UnknownHostException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    //循环向服务端发送消息    public static void test1() throws UnknownHostException, IOException {        //创建客户端socket对象        Socket socket = new Socket("localhost",10086);        //获取键盘输入        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));        //获取向服务器的写入流        OutputStream os = socket.getOutputStream();        BufferedWriter bw = new BufferedWriter(                new OutputStreamWriter(os));        //键盘输入字符串,写到服务器        while(true) {            System.out.println("请输入一个字符串");            String str = br.readLine();            System.out.println(str);            //退出条件,输入“再见”            if(str!=null&&str.equals("再见")) {                break;            }            bw.write(str);            bw.newLine();            bw.flush();        }        //3关闭资源        socket.close();    }    public static void test() throws UnknownHostException, IOException {        //创建客户端socket对象        Socket socket = new Socket("localhost",10086);        //获取向服务器的写入流        OutputStream os = socket.getOutputStream();        BufferedWriter bw = new BufferedWriter(                new OutputStreamWriter(os));        bw.write("你好吗,你吃了吗");        bw.flush();        //3关闭资源        socket.close();    }}

服务端

package com.ibeifeng3;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.ServerSocket;import java.net.Socket;//字符流给服务器发送消息public class ServerDemo {    public static void main(String[] args) {        try {            test1();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    //循环读取客户端的消息    public static void test1() throws IOException {        //1 创建一个服务端的Socket对象        ServerSocket server = new ServerSocket(10086);        System.out.println("服务器启动");        //2 监听客户端的连接         Socket socket = server.accept();        //3 建立客户端的输入通道        InputStream  is = socket.getInputStream();        BufferedReader br = new BufferedReader(new InputStreamReader(is));        String line = null;        while((line=br.readLine())!=null) {            System.out.println(line);        }        //4 释放相关的资源//      is.close();        socket.close();    }    public static void test() throws IOException {        //1 创建一个服务端的Socket对象        ServerSocket server = new ServerSocket(10086);        System.out.println("服务器启动");        //2 监听客户端的连接         Socket socket = server.accept();        //3 建立客户端的输入通道        InputStream  is = socket.getInputStream();        BufferedReader br = new BufferedReader(new InputStreamReader(is));        System.out.println(br.readLine());//显示客户端发送的内容        //4 释放相关的资源//      is.close();        socket.close();    }}

简易版服务器交互

服务端

package com.ibeifeng2;import java.io.IOException;import java.io.InputStream;import java.net.ServerSocket;import java.net.Socket;//网络通信,  --->ip ,---->端口    (前1024不要使用)public class ServerDemo {    public static void main(String[] args) {        try {            test();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    public static void test() throws IOException {        //1 服务端的socket对象        ServerSocket server = new ServerSocket(12345);        System.out.println("服务器启动");        //2 监听12345端口,接受客户端的连接        Socket socket =  server.accept();//阻塞        //3 建立客户端的写入通道        InputStream is  = socket.getInputStream();        byte[] byts = new byte[1024];        is.read(byts);        System.out.println(new String(byts));        //4 关闭资源        socket.close();    }}

客户端

package com.ibeifeng2;import java.io.IOException;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;public class ClientDemo {    public static void main(String[] args) {        try {            test();        } catch (UnknownHostException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    private static void test() throws UnknownHostException, IOException {        // 1 创建客户端的 socket对象        Socket socket = new Socket("localhost", 12345);         // 2 获取写入流对象        OutputStream fos = socket.getOutputStream();        fos.write("你吃饭了吗".getBytes());        // 关闭资源        fos.close();        socket.close();    }}

同步异步

同步1

package com.ibeifeng1;//异步产生的问题public class AsyncronizeDemo {    //取款    --存款1百万,主卡副卡分别取钱,每次各取1万,取完为止    public static void main(String[] args) {         //创建两个线程分别模拟主卡、副卡        DrawMoneyThread mainCard = new DrawMoneyThread("主卡");        DrawMoneyThread secondCard = new DrawMoneyThread("副卡");        mainCard.start();        secondCard.start();    }}class DrawMoneyThread extends Thread {    public DrawMoneyThread(String name) {        super(name);    }    static int deposit = 100;//存款100万    int money;    @Override    public void run() {        while(deposit>0) {            deposit--;            money++;            System.out.println(getName()+"取款1万,"+"剩余"+deposit);        }    }}

同步2

package com.ibeifeng1;//解决卖票的问题, 使用同步//模拟卖票窗口,同时卖票,出现重票,负票public class AsyncronizeDemo1 {    public static void main(String[] args) {        SellTicket st1 = new SellTicket("窗口1");        SellTicket st2 = new SellTicket("窗口2");        SellTicket st3 = new SellTicket("窗口3");        st1.start();        st2.start();        st3.start();    }}class SellTicket extends Thread {    static int tickets = 100;    public SellTicket(String name) {        super(name);    }    @Override    public void run() {        while(true) {            System.out.println(getName()+" 卖出第"+tickets+"张票");            tickets--;            if(tickets<=0) {                break;            }        }    }}

同步3

package com.ibeifeng1;//同步代码,使用Synchronized关键字解决同步问题public class SynchronizedDemo {    public static void main(String[] args) {        SellTicket1 st = new SellTicket1("1窗口");        SellTicket1 st1 = new SellTicket1("2窗口");        st.start();        st1.start();    }}class SellTicket1 extends Thread {    static int tickets = 100;    private static Object obj = new Object();    public SellTicket1(String name) {        super(name);    }    @Override    public void run() {        boolean flag = true;        while (flag) {            flag = sellTickets_static();        }    }    //静态同步方法  ----  》静态方法的锁对象是  类相关信息的对象,理解为字节码文件    private static synchronized boolean sellTickets_static() {        if (tickets > 0) {            System.out.println(Thread.currentThread().getName() + " 卖出第" + tickets + "张票");            tickets--;        }         if(tickets<=0) {            return false;        }        return true;    }    //非静态同步方法  ----  》非静态方法的锁对象是 this,也即  当前对象    private synchronized boolean sellTickets() {        if (tickets > 0) {            System.out.println(getName() + " 卖出第" + tickets + "张票");            tickets--;        }         if(tickets<=0) {            return false;        }        return true;    }}

使用Synchronized关键字解决同步问题

package com.ibeifeng1;//同步代码,使用Synchronized关键字解决同步问题public class SynchronizedDemo1 {    public static void main(String[] args) {        SellTicket4 st = new SellTicket4("1窗口");        SellTicket4 st1 = new SellTicket4("2窗口");        st.start();        st1.start();    }}class SellTicket4 extends Thread {    static int tickets = 100;    private static Object obj = new Object();    public SellTicket4(String name) {        super(name);    }    @Override    public void run() {        boolean flag = true;        while (flag) {            // 传一个对象,作为锁对象            synchronized (obj) { //SellTicket4.class                if (tickets > 0) {                    System.out.println(getName() + " 卖出第" + tickets + "张票");                    tickets--;                }            }            if(tickets<=0) {                flag = false;            }        }    }}

同步5

package com.ibeifeng1;public class SynchronizedDemo2 {    public static void main(String[] args) {        SellTicket3 st = new SellTicket3();        Thread t = new Thread(st);        Thread t1 = new Thread(st);        t.start();        t1.start();    }}class SellTicket3 implements Runnable {    static int tickets = 100;    @Override    public void run() {        boolean flag = true;        while (flag) {            flag = sellTickets();        }    }    //非静态同步方法  ----  》非静态方法的锁对象是 this,也即  当前对象    private synchronized boolean sellTickets() {        if (tickets > 0) {            System.out.println(Thread.currentThread().getName() + " 卖出第" + tickets + "张票");            tickets--;        }         if(tickets<=0) {            return false;        }        return true;    }}
0 0