6,线程

xiaoxiao2021-02-28  48

package caokangnsd; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class ThreadAndExcutorS { /* * 这里打算从线程池开始线程 */ // 进程和线程的关系,进程可以包含多个线程,进程在内存上有一块空间,线程活跃在这个空间内 // 线程的并发,这也是线程存在的意义,线程可以使多个业务同时进行,但又不是同时的,是分别获取cpu时间片运行的,尽可能 // 均匀分配给各个程序,cpu在同一时间只能干一个事情,其他的线程则停止 // new-runnable-run-blocked-dead public static void main(String[] args) { /* * 現在我們新建一個線程 */ //1 Thread t1 = new Thread(); // 很显然需要有一个执行的方法和业务 Thread t2 = new Thread() { public void run() {// 非常重要的run方法 System.out.println("haha"); } }; t2.start(); //2 Thread t3 = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub System.out.println("heihei"); } }); t3.setPriority(Thread.MAX_PRIORITY);// 设置线程的优先级为最高的10 t3.start(); // 当然你也可以重写类继承他们 // 获取相关信息的方法 System.out.println(t2.getId()); System.out.println(t2.getName()); System.out.println(t2.getPriority()); System.out.println(t2.isAlive()); System.out.println(t2.isDaemon()); System.out.println(t2.isInterrupted()); System.out.println(Thread.currentThread()); // Thread tr = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < 50; i++) { if (i > 30 & i < 40) { Thread.yield();// yield,放弃本次时间片等待下次 } else { System.out.println(i); } try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }); // Thread tr1 = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub for (int i = 100; i < 150; i++) { try { Thread.sleep(100);// sleep } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } System.out.println(i); try { tr.join();// 充分说明只有join的线程的run方法结束之后才会继续运行 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // try { // tr.wait(); // } catch (InterruptedException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // if(i>150) { // tr.notify(); // } } } }); tr1.setDaemon(true);// deamon,所有非守护线程结束则自动结束 // tr.start(); // tr1.start(); /* * 锁机制 所谓异步操作是指多线程并发的操作,相当于各干各的。 所谓同步操作是指有先后顺序的操作, * 相当于你干完我再干。当一个资源被多个线程共同访问时,为了保证共享资源的互斥访问需要加一个 * 先来后到。  * synchronized&Lock * synchronized对象监视器Contention List》》Entry List》》Owner;队列 * 当线程通过锁时是不能被Thread.interrupt()中断的 *  * Lock,是一个类不在是java的内置语言,需要手动释放 * ReentrantLock,公平锁和非公平锁,可以设置为公平锁 * */ // 举例 Test2 test = new Test2(); Thread td = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub test.add(); } }); Thread td1 = new Thread(new Runnable() { @Override public void run() { test.add(); } }); td.start(); td1.start(); /* * 最后得出的结论,当锁住一个方法或一个区域后, * 1,不用线程调用相同对象test的相同锁方法add2则会排队,不同锁方法(非静态)会互斥排队 * 2,调用锁区域的时候,只有相同才会排队,且锁区域不会锁住对象 * 3,静态方法的锁只在类调用时有用 */ //并发的  原子性  可见性  有序性 //volatile修饰变量保证每次线程调用时都会读取一下值 /* *  * 线程池的使用 *  */ //我们已知的线程Executor->ExecutorService->AbstractExecutorService->ThreadPoolExecutor //我们需要去了解几种线程池的使用和ThreadExcutorService //1,固定大小的线程池 Thread test1=new Thread(); ExecutorService ts=Executors.newFixedThreadPool(50); ts.execute(test1);//这个空线程已经加入了线程池 ts.shutdown();//关闭线程池 //2,管理时间的线程池 ScheduledExecutorService ss=Executors.newScheduledThreadPool(20); ss.scheduleAtFixedRate(test1, 1, 3, TimeUnit.SECONDS);//延时一秒每3秒执行一次 //3, ThreadPoolExecutor tpe=new ThreadPoolExecutor(20, 20, 20, TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(10)); //核心池20个最大20个20秒,队列内10个 tpe.execute(test1); tpe.submit(test1);// /* * 大概是这样设置的,当线程池的大小大于core大小时,进入的线程进入缓存队列,当到达时间后,如果 * 缓存中的线程仍然没有得到利用,那么终止 *  * 另外还有制造线程的线程工厂暂时不做讨论 *  */ } } // class Test2 { private static List<String> list = new ArrayList<String>(); public void add() { System.out.println(Thread.currentThread()); synchronized (list) { for (int i = 0; i < 10; i++) { list.add(i + ""); System.out.println(i); } } } public synchronized void add2() { System.out.println(Thread.currentThread()); for (int i = 0; i < 50; i++) { list.add(i + ""); System.out.println(i); } } public synchronized static void add3() { System.out.println(Thread.currentThread()); for (int i = 0; i < 50; i++) { list.add(i + ""); System.out.println(i); } } public List getList() { return list; } public void de() { list.remove(0); } }

 

转载请注明原文地址: https://www.6miu.com/read-2624965.html

最新回复(0)