其他分享
首页 > 其他分享> > 线性

线性

作者:互联网

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