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
- Thread-概念和实例
- 一个概念,Thread和Runnable的差别
- thread概念
- oracle概念:实例和数据库
- Geometry Shader 概念和实例
- ajax概念和使用实例
- java socket和多线程(Thread)实例
- java socket和多线程(Thread)实例
- java socket和多线程(Thread)实例
- Java socket和多线程(Thread)实例
- java socket和多线程(Thread)实例
- Runnable和Thread实现多线程区别实例
- 7.1 Thread概念
- Oracle 概念(3)-数据库和实例
- java 注解的概念和实例
- Oracle中的实例和数据库概念
- maven的一些概念和实例
- 事物和原子性概念实例
- ubuntu 装 JDK
- Elasticsearch windows下一键安装实现深入详解
- DSM -- 进入linux文件系统
- openstack安装keystone过程中提示requires:PyYAML的解决方案
- form表单回车提交问题
- Thread-概念和实例
- 十篇安卓文章,都挺不错的
- Leafletjs学习教程和相关代码整理
- PHP.ini部分配置说明
- python *args **kwargs用法
- icarousel旋转木马的详解--当前itemscale和alpha
- 支持向量机SVM算法原理笔记2
- Spring 框架简介
- 从Dinnr失败看产品市场可行性认知有哪些不足