ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

线性

2022-06-01 15:32:00  阅读:146  来源: 互联网

标签:Thread thread 线程 learn 线性 new public


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有