多线程
2021-05-01 07:28
标签:OLE 多线程 ati pac god stack zed block 存在 进程是执行程序的一次执行过程,是系统资源分配的单位;一个进程可以包含若干个线程,线程是CPU调度和执行的单位; 网图下载 创建线程方法2:实现runable接口,重写run方法,执行线程需要丢入runable接口实现类,调用start方法 真实对象和代理对象都要实现同一个接口 代理的好处:代理对象可以做很多真实对象做不了的事情 函数式接口:任何接口如果只包含一个抽象方法,那么他就是一个函数式接口;对于函数式接口,可以通过lambda表达式来创建该接口的对象 通过外部标志位和外部停止方法进行停止 并发:同一个对象被多个线程同时操作 给方法加上synchronized关键字即可,synchronized方法控制对对象的访问,每个对象对应一把锁,每个synchronized方法都必须获得调用该方法的对象的锁才能执行,否则线程会阻塞,同步块就是synchronized(obj){},要同步就是要锁变化的量 产生死锁的四个必要条件: 只要破解其中的任意一个或多个条件就能避免死锁 java.util.concurrent.locks.Lock接口,ReentrantLock类实现了Lock,可以显式加锁释放锁 java提供了几个方法解决线程之间的通信问题 两种解决方法: 提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中,可以避免频繁创建销毁,实现重复利用 优点: 多线程 标签:OLE 多线程 ati pac god stack zed block 存在 原文地址:https://www.cnblogs.com/python-road/p/13220870.html多线程
一.继承Thread类
package oop;
//线程开启不一定执行,由CPU调度执行
public class Test2 extends Thread{
@Override
public void run() {
for(int i=0;i
package oop;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
//实现多线程同步下载图片
public class Test2 extends Thread{
private String url;
private String name;
public Test2(String url,String name){
this.name=name;
this.url=url;
}
@Override
public void run() {
WebDownloader webDownloader=new WebDownloader();
webDownloader.downloader(url,name);
System.out.println("下载的文件名围殴"+name);
}
class WebDownloader{
public void downloader(String url,String name){
try {
FileUtils.copyURLToFile(new URL(url), new File(name));
}catch(IOException e){
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Test2 test1=new Test2("https://t8.baidu.com/1.jpg","1.jpg");
Test2 test2=new Test2("https://t8.baidu.com/2.jpg","2.jpg");
Test2 test3=new Test2("https://t8.baidu.com/3.jpg","3.jpg");
test1.start();
test2.start();
test3.start();
}
}
二.实现Runable接口
package oop;
public class Test2 implements Runnable{
@Override
public void run() {
for(int i=0;i
三.继承Thread类和实现Runnable接口对比
多线程同时使用实现Runnable接口对象package oop;
public class Test2 implements Runnable {
private int ticketNums = 10;
@Override
public void run() {
while (true) {
if (ticketNums
四.静态代理
代理对象要代理真实角色package oop;
public class Test2{
public static void main(String[] args) {
WeddingCompany weddingCompany=new WeddingCompany(new You());
weddingCompany.HappyMarry();
}
}
interface Marry{
void HappyMarry();
}
class You implements Marry{
@Override
public void HappyMarry() {
System.out.println("结婚了");
}
}
class WeddingCompany implements Marry{
private You target;
public WeddingCompany(You target){
this.target=target;
}
@Override
public void HappyMarry() {
before();
this.target.HappyMarry();
after();
}
private void before(){
System.out.println("结婚前");
}
private void after(){
System.out.println("结婚后");
}
}
真实对象能专注做直接的事情五.lambda表达式
package oop;
public class Test2{
public static void main(String[] args) {
//形式1.
Like like1= (int a)->{ System.out.println("我爱你"); };
//形式2.
Like like2=(a)->{
System.out.println("你忙吧");
};
Like like3=a-> System.out.println("hhh");
like1.lambda(1);
like2.lambda(1);
like3.lambda(1);
}
}
interface Like{
void lambda(int a);
}
六.线程停止
package oop;
public class Test2 implements Runnable{
private boolean flag=true;
@Override
public void run() {
int i=0;
while(flag){
System.out.println("Run"+i++);
}
}
public void stop(){
this.flag=false;
}
public static void main(String[] args) {
Test2 test2=new Test2();
new Thread(test2).start();
for(int i=0;i
七.线程休眠
八.线程礼让
package oop;
public class Test2{
public static void main(String[] args) {
MyYield myYield=new MyYield();
new Thread(myYield,"dwx").start();
new Thread(myYield,"zzz").start();
}
}
class MyYield implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"线程开始执行");
Thread.yield();//礼让
System.out.println(Thread.currentThread().getName()+"线程停止执行");
}
}
线程状态
package oop;
public class Test2{
public static void main(String[] args) {
Thread thread=new Thread(()->{
for(int i=0;i
十.线程的优先级
- Thread.MIN_PRIORITY=1;
- Thread.MAX_PRIORITY=10;
- Thread.NORM_PRIORITY=5;
改变或获取优先级
getPriority(); setPriority(int XXX)
设置在start()之前十一.守护线程
package oop;
public class Test2{
public static void main(String[] args) {
God god =new God();
You you =new You();
Thread thread=new Thread(god);
thread.setDaemon(true);//默认为false,普通线程,设置为true后为守护线程。
thread.start();
new Thread(you).start();
}
}
class God implements Runnable{
@Override
public void run() {
while(true){
System.out.println("上帝保佑你");
}
}
}
class You implements Runnable{
@Override
public void run() {
for(int i=1;i
十二.线程同步
线程同步:其实就是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面线程使用完毕,下一个线程再使用。同步方法和同步块
package oop;
import java.util.ArrayList;
import java.util.List;
//不安全的买票
public class UnsafeList{
public static void main(String[] args) {
List
死锁
Lock(锁)
ReentrantLock lock=new ReentrantLock();
lock.lock();//加锁
lock.unlock();//解锁
十三.线程通信
解决生产者消费者问题
十四.线程池
package oop;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestPool{
public static void main(String[] args) {
//创建线程池
ExecutorService service= Executors.newFixedThreadPool(10);
//执行
service.execute(new MyThread());
//关闭连接
service.shutdown();
}
}
class MyThread implements Runnable{
@Override
public void run() {
for (int i = 0; i