线性
作者:互联网
java基础语法--线性
线性大纲
1 -先考虑,是否是(多线程问题) 2- 是否有(共享数据) 3- 是否存在-线性安全问题 4- 是否,线性通讯
创建--线程的4种方法 1- 继承 - extend Thread(1-3) 类.class 2- 实现 - implements Runnable(4) this 3-Callable - implements Callable 4- 使用线程池
解决线程安全问题3种方法(在securiyy里面) 1- 同步代码块 同步监视器(一直用这一个就可以了):Object obj = new Object(); 语法: synchronized(同步监视器){ //需要被同步的代码,(一般都是---操作的步骤) } 2- 同步方法 略 3- lock // 1- 多引入这个---ReentrantLock private ReentrantLock lock = new ReentrantLock(); // 2- 在共同操作上 + 一个try--和 下面finally连用
通讯 break前----wait(); synchronized后-----notifyAll();
创建线程
1 - extend Thread(继承的方法---创建)
继承的方式
package _366After.src.javeTeacher.thread_learn.thread_learn_1; //线程(thread) /* 多线程的创建:方式一:继承于thread类 1- 创建一个继承于Thread类的子类 2- 重写Thread类的run()方法 -->这里写主要的操作(我这边写的是--便利100以内的偶数) 3- 创建Thread类的子类的对象 4- 通过此对象调用start() such as: 便利100以类的所有偶数 */ //———————————————————————————————————————————————————————— //1- 创建一个继承于Thread(自带的)类的子类 class MyThread extends Thread { //2- 重写Thread类的run()方法 @Override public void run() { for (int i = 0; i < 100; i++) { if (i % 2 == 0) { System.out.println(Thread.currentThread().getName() + ":" + i); } } } } public class thread_learn_1 { public static void main(String[] args) { //3- 创建Thread类的子类的对象 MyThread T1 = new MyThread(); //4- 通过此对象调用start() T1.start(); //问题3 --的解决 MyThread T2 = new MyThread(); T2.start(); //______________________________________________________________ /** * 问题1 -能不能把上面的T1.start(); 换成 T1.run() * 回答:不能 */ //______________________________________________________________ /** * 问题2 -能不能调完一次T1.start(); 再来一次T1.start();? * 回答:不能 */ //______________________________________________________________ /** * 问题3 -想再起一个线程,便利100以内的问题,怎么办?(和上面线程内容一样) * 回答:需要再新建一个线程对象 * * eg:MyThread T2 = new MyThread(); * T2.start(); */ //______________________________________________________________ /** * 问题4 -如果要开启两个不同的线程,怎么办 * 回答:再Thread_learn2中(下一个) */ } }
*对上面问题四对解决
解决上面的问题(四)
package _366After.src.javeTeacher.thread_learn.thread_learn_2; /** * 对thread_learn-1 的解决 * 问题4 -如果要开启两个不同的线程,怎么办 * 回答:1。什么都写两遍(在下面) * 2。可以简单的写() */ //—————————————————————————————————————————————————————————————————— class MyThread1 extends Thread { //2- 重写Thread类的run()方法 @Override public void run() { for (int i = 0; i < 100; i++) { if (i % 2 == 0) { System.out.println(Thread.currentThread().getName() + ":" + i); } } } } class MyThread2 extends Thread { //2- 重写Thread类的run()方法 @Override public void run() { for (int i = 0; i < 100; i++) { if (i % 2 != 0) { System.out.println(Thread.currentThread().getName() + ":" + i); } } } } public class thread_learn_2 { public static void main(String[] args) { //3- 创建Thread类的子类的对象 MyThread1 T1 = new MyThread1(); MyThread2 T2 = new MyThread2(); //4- 通过此对象调用start() T1.start(); //4.5 --通过此对象调用start() T2.start(); //--------------------------------------------------------------------------------------------------- //于上面无关,只是简单的写法 //方便写法(四合一 ) new MyThread2() { @Override public void run() { for (int i = 0; i < 100; i++) { if (i % 2 != 0) { System.out.println(Thread.currentThread().getName() + ":" + i); } } } }.start(); } }
2- 测试Thread常用的方法(附加篇)
thread常用方法
package _366After.src.javeTeacher.thread_learn.thread_learn_3; /** * (一)测试Thread中常用的方法: * 1- start:启动当前线程:调用当前线程的run() * <p> * 2- run():通常需要重写Thread类中的此方法:将创建的线程都要执行的操作声明在此方法中 * <p> * 3- currentThread():静态方法,返回执行当前代码的线程 * <p> * 4- getName():获取当前线程的名字 * <p> * 5- setName():设置当前线程的名字-->小线程用new的调,主线程用Thread(自带的)调 * <p> * 6- yield():主动放弃当前线程(一次),给别的线程 ---->用法:Thread.yield(); * <p> * 7- join(): (小三)当join(join就是小三)插入后,小三会一直得宠,直到小三离开,正牌才会出来 * ————注释:当jion爆红的时候,直接给她一个try就可以了 * <p> * 8- sleep(long millitime):睡眠当前线程---就是睡着了,动的很慢 * * ————注释:当sleep爆红的时候,直接给她一个try就可以了 * <p> * 9- isAlive():判断当前线程是否存活 * <p> * <p> * ————————————————————————————————————————————————————————————————————————————————————— * ———————————————————————————————————————————————————————————————————————————————————— * <p> * <p> * (二)线程的优先级 * 1- MAX_PRIORITY:10 * MIN_PRIORITY:1 * NORM_PRIORITY:5 * <p> * 2- 如何获取和设置当前线程的优先级 * getpriority(); //获取线程的优先级 * setpriority(int p); //设置线程的优先级 * <p> * 3- */ //1- 创建一个继承于Thread(自带的)类的子类 class MyThread extends Thread { //2- 重写Thread类的run()方法 @Override public void run() { for (int i = 0; i < 100; i++) { if (i % 2 == 0) { try { sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + Thread.currentThread().getPriority() + ":" + i + "wsT1"); } if (i % 30 != 0) { //这里使用yield, Thread.yield(); } } } } public class thread_learn_3 { public static void main(String[] args) { //3- 创建Thread类的子类的对象 MyThread T1 = new MyThread(); //*附加——给(小)线程起名字 T1.setName("我是一个小线程"); //todo 是不是(分线程和主线程的引入方式不同) //设置(分线程)的优先级 T1.setPriority(Thread.MAX_PRIORITY); //4- 通过此对象调用start() T1.start(); //______________________________________________—————————————————— //**附加:给主线程起名字 Thread.currentThread().setName("我是主线程"); //todo //设置(主线程)的优先级 Thread.currentThread().setPriority(Thread.MIN_PRIORITY); for (int i = 0; i < 100; i++) { if (i % 2 != 0) { System.out.println(Thread.currentThread().getName() + Thread.currentThread().getPriority() + ":" + i); } if (i == 90) { try { T1.join(); //这个是把T1,插队进来的意思 } catch (InterruptedException e) { e.printStackTrace(); } } } //isAlive System.out.println(T1.isAlive()); } }
3- implements Runnable(实现的方法--创建)
实现的方法(创建)
package _366After.src.javeTeacher.thread_learn.thread_learn_4_new; /* 和前面的-不同 前面用的是(继承) 这里用的是(实现) */ class Mythread implements Runnable { private int ticket = 100; @Override public void run() { while (true) { if (ticket > 0) { System.out.println(Thread.currentThread().getName() + ":" + ticket); ticket--; } else { break; } } } } public class thread_learn_4 { public static void main(String[] args) { //new的是(操作)的类名 Mythread w = new Mythread(); //将new的放入--Thread(自带)的构造器中 Thread t1 = new Thread(w); Thread t2 = new Thread(w); Thread t3 = new Thread(w); t1.setName("1hao"); t2.setName("2hao"); t3.setName("3hao"); t1.start(); t2.start(); t3.start(); } }
4- Callable(实现的方法--创建)
package _366After.src.javeTeacher.thread_learn.thread_learn_callable; /* 使用Callable来创建 */ import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; //0- 创建一个Callable的实现类 class Number implements Callable { //1- 重写Callable的方法,将此线程需要的操作,放在Call方法中 @Override public Object call() throws Exception { int sum = 0; for (int i = 1; i <= 100; i++) { if (i % 2 == 0) { System.out.println(i); sum += i; } } //如果不要放回值--就写null,也不需要6了 return sum; } } public class thread_learn_Callable { public static void main(String[] args) { //2- 创建Callable接口的实现类的对象 Number number = new Number(); //3- 将Callable接口实现类的对象,作为传递值到FutureTask构造器中,创建FutureTask的对象 FutureTask futureTask = new FutureTask(number); //5- 将FutureTask的对象作为参数传递到Thread类的构造器中,创建Thread对象,并调用start(); new Thread(futureTask).start(); try { //6- get方法的返回值 ,为构造器futureTast构造器参数Callable实现类重写方法call()的返回值 Object sum = futureTask.get(); System.out.println("总和" + sum); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }
5-线程池(创建)
线程池(创建)
package _366After.src.javeTeacher.thread_learn.thread_learn_threadPool; /* 使用--线程池 */ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; //第一个操作 class Number implements Runnable { @Override public void run() { for (int i = 1; i < 100; i++) { if (i % 2 == 0) { System.out.println(Thread.currentThread().getName()+i); } } } } //第二个操作 class Number1 implements Runnable { @Override public void run() { for (int i = 1; i < 100; i++) { if (i % 2 != 0) { System.out.println(Thread.currentThread().getName()+":"+i); } } } } public class thread_learn_ThreadPool { public static void main(String[] args) { //1- 设置-线程池的最大容量---Executors. ExecutorService service = Executors.newFixedThreadPool(10); //附加1 --线程池的管理(转化) ThreadPoolExecutor service1 =(ThreadPoolExecutor) service; //附加2- 设置属性 service1.setCorePoolSize(15); // service1.setKeepAliveTime(); /** * 2- 使用线程 * service.execute();//适合-适用于Runnable * service.submit();//适合-适用于Callable */ //如果要使用,两个线程--写两个@override(如下) service.execute(new Number()); service.execute(new Number1()); //3- 关闭线程池 service.shutdown(); } }
6- 生命周期
7- 解决线性安全(利用的是--线程的同步机制)
1-同步代码块
同步代码块
基本语法: //同步监视器(要统一) //普通用:Object obj = new Object(); //继承用:类.class (OR) private static Object obj = new Object(); //实现用:this (OR) private Object obj = new Object(); synchronized(同步监视器){ //需要被同步的代码,(一般都是---操作的步骤) } //———————————————————————————————————————————————————————————————————————————————————————————— 案例 --实现 class Mythread implements Runnable { private int ticket = 100; Object obj = new Object(); @Override public void run() { synchronized (obj) { //- while (true) { if (ticket > 0) { System.out.println(Thread.currentThread().getName() + ":" + ticket); ticket--; } else { break; } } } //- } }
2- 同步方法(略)
3- lock
lock-线程安全
lock // 1- 多引入这个---ReentrantLock private ReentrantLock lock = new ReentrantLock(); // 2- 使用 lock.lock(); 和 lock.unlock() //—————————————————————————————————————————————————————————————————————————————————————— package _366After.src.javeTeacher.thread_learn.thread_learn_security; /* 使用Lock锁的方式解决线程安全问题 */ import java.util.concurrent.locks.ReentrantLock; import static java.lang.Thread.sleep; class Window implements Runnable{ private int ticket = 100; //1.实例化Reentrantlock类 ReentrantLock lock = new ReentrantLock(); @Override public void run() { while (true){ try{ //2.调用锁定方法lock() lock.lock(); if (ticket > 0){ try { sleep(100); //使用sleep方法增加未加锁前,程序错票,重票的概率 } catch (InterruptedException e) { //抛出InterruptedException异常 e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ": 售票,票号为;" + ticket); ticket--; }else { break; } }finally { //3.调用解锁方法unlock() lock.unlock(); } } } }
通信
通信
package _366After.src.javeTeacher.thread_learn.thread_learn_communication; /* 通信--可以让用户,共享数据 */ class Number implements Runnable { private int number = 1; //如果要使用obj,那么下面的notifyAll和wait--也要是obj的 private Object obj = new Object(); @Override public void run() { while (true) { // synchronized (this) { synchronized (obj) { //和wait合用,每次解锁一下 //notifyAll(); obj.notifyAll(); if (number < 100) { try { Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ":" + number); number++; try { //wait(阻塞) //wait(); obj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } else { break; } } } } }
标签:Thread,thread,线程,learn,线性,new,public 来源: https://www.cnblogs.com/chen-zhou1027/p/16334380.html