zoukankan      html  css  js  c++  java
  • Java线程

    首先了解进程:是一个可执行程序放在计算机存储器的一个指令序列,它是一个动态执行过程

    1线程定义

    类似是进程的子程序

    2线程创建

    分为继承Thread类

    线程的创建和启动下面的代码实现

    package com.jiedada.thread;
    //继承线程对象
     class MyThreads extends Thread{
         public MyThreads(String name)
         {
             super(name);
         }
         public void run()
         {
             for(int i=1;i<10;i++)
             {
                 System.out.println(getName()+"这是第"+i+"次线程");
             }
         }
     }
    public class ThreadOne {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            //创建线程对象
            MyThreads my1=new MyThreads("线程1");
            MyThreads my2=new MyThreads("线程2");
            my1.start();
            my2.start();
        }
    
    }
    View Code

    和接口Runnable

    为什么有类的线程却要再用runnalbe接口呢

    1如果一个类继承了一个类,就不能继承Thread类了

    2因为一些类只想使用run这一个方法

    接口创建的类可以创建多个对象

    接口类的定义,接口类的实列和start方法代码

    package com.jiedada.thread;
    //接口类的创建
    class RunTest implements Runnable{
    
        @Override
        public void run() {
            // TODO Auto-generated method stub
            int i=1;
            while(i<10)
            {
                System.out.println(Thread.currentThread().getName()+"这是线程"+(i++));
            }
        }
        
    }
    public class Test {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            //接口类的调用start方法,接口类发生的情况
       RunTest r1=new RunTest();
       Thread thread=new Thread(r1);
       thread.start();
       RunTest r2=new RunTest();
       Thread t1=new Thread(r2);
       t1.start();
        }
    
    }
    View Code

    3线程的状态和生命周期

    1线程的状态分为

    创建

    可运行

    正在运行

    sleep请求,是一个Thread的静态方法,在在使用的时候需要使用try catch来捕获程序终端异常

    可以是用于计时器,一段时间的数据更新

    package com.jiedada.thread;
    class SleepThread implements Runnable{
    
        @Override
        public void run() {
            // TODO Auto-generated method stub
            for(int i=0;i<15;i++)
            {
                System.out.println(Thread.currentThread().getName()+"这是线程"+i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        
    }
    public class SleepTest {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
       SleepThread s1=new SleepThread();
       Thread t=new Thread(s1);
       t.start();
        }
    
    }
    View Code

    join请求,join是一个最终的方法等待调用该线程结束后才能执行;

    package com.jiedada.thread;
    class JoinT implements Runnable{
    
        @Override
        public void run() {
            // TODO Auto-generated method stub
            for(int i=0;i<15;i++)
            {
                System.out.println(Thread.currentThread().getName()+"这是一个线程"+i);
            }
        }
        
    }
    public class JoinThread {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            
            JoinT j=new JoinT();
            Thread t=new Thread(j);
            t.start();
            //这是一个join的方法里面可以放入时间参数
            try {
                t.join();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("这是主线程");
        }
    
    }
    View Code

    阻塞

    终止

    线程优先级

    Java为线程优先级提供了1-10的优先级,超出范围会抛出异常

    主线程优先级为5

    package com.jiedada.thread;
    class pThread extends Thread{
        String name;
        public pThread(String name) {
            this.name=name;
        }
        public void run()
        {
            for(int i=0;i<10;i++)
            {
                System.out.println(getName()+"这是线程"+i);
            }
        }
    }
    public class youxianji {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int sum=Thread.currentThread().getPriority();
            System.out.println(sum);
            pThread p=new pThread("线程1");
            pThread p1=new pThread("线程2");
            p.setPriority(10);
            p1.setPriority(1);
            p.start();
            p1.start();
    
        }
    
    }
    View Code

    4线程调度

    5同步与死锁

    多线程运行的问题

    1各个线程竞争CPU时间而获得运行时间

    2各线程什么时候得到CPU时间,占用多久,是不可预测的

    3一个正在运行着的线程在上面地方被暂停是不确定的

    解决办法(同步)

    用synchronized关键字来定义可以用于

    1成员方法

    2静态方法

    3语句快

    银行系统实列

    bank类

    package com.jiedada.bank;
    
    public class Bank {
        private String count;
        private int money;
        public Bank()
        {
            
        }
        public Bank(String count, int money) {
            super();
            this.count = count;
            this.money = money;
        }
        public String getCount() {
            return count;
        }
        public void setCount(String count) {
            this.count = count;
        }
        public int getMoney() {
            return money;
        }
        public void setMoney(int money) {
            this.money = money;
        }
        @Override
        public String toString() {
            return "Bank [count=" + count + ", money=" + money + "]";
        }
        //存入钱
        public synchronized void SaveAccount()
        {
            int countmoney=this.money;
            countmoney+=200;
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            setMoney(countmoney);
            System.out.println("存入后的钱为:"+countmoney);
        }
        //取钱操作
        public synchronized void DrawAccount()
        {
            int countmoney=this.money;
            countmoney-=100;
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            setMoney(countmoney);
            System.out.println("取出钱后为:"+countmoney);
        }
    
    }
    View Code

    save money类

    package com.jiedada.bank;
    //存钱
    public class SaveMoney implements Runnable{
        Bank bank;
        public SaveMoney(Bank bank)
        {
            this.bank=bank;
        }
        @Override
        public void run() {
            // TODO Auto-generated method stub
            bank.SaveAccount();
        }
             
    
    }
    View Code

    draw money类

    package com.jiedada.bank;
    
    public class DrawMoney implements Runnable {
    
        Bank bank;
    
        public DrawMoney(Bank bank)
        {
            this.bank=bank;
        }
    
        @Override
        public void run() {
            // TODO Auto-generated method stub
            bank.DrawAccount();
        }
       
    }
    View Code

    test类

    package com.jiedada.bank;
    
    public class Test {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            //创建账户
            Bank huang=new Bank("huangdada",1000);
            //创建线程
            SaveMoney s=new SaveMoney(huang);
            Thread t1=new Thread(s);
            DrawMoney d=new DrawMoney(huang);
            Thread t2=new Thread(d);
            t1.start();
            t2.start();
            try {
                t1.join();
                t2.join();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            System.out.println(huang);
    
        }
    
    }
    View Code

     问腿

    当银行中的钱不够时,我们就不能取出钱了。

    举例生产者和消费者问题

    qeuqe类

    package com.jiedada.prodacanduse;
    
    public class Qeuqe {
        private int n;
        boolean flag=false;
        public synchronized int get()
        {
            if(!flag)
            {
                try {
                    wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            System.out.println("取出的:"+n);
            flag=false;
            notifyAll();
            return n;
        }
        public synchronized int set(int n)
        {
            if(flag)
            {
                try {
                    wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            System.out.println("存入的:"+n);
            flag=true;
            notifyAll();
            return this.n=n;
            
        }
    }
    View Code

    prodtion类

    package com.jiedada.prodacanduse;
    
    public class Prodction implements Runnable{
        Qeuqe qeuqe;
        public Prodction(Qeuqe qeuqe)
        {
            this.qeuqe=qeuqe;
        }
    
        @Override
        public void run() {
            // TODO Auto-generated method stub
            int i=0;
            while(true)
            {
            qeuqe.set(i++);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            }
        }
    
    }
    View Code
    user类
    package com.jiedada.prodacanduse;
    
    public class User implements Runnable{
          Qeuqe queqe;
          
          public User(Qeuqe qeuqe)
          {
              this.queqe=qeuqe;
          }
    
        @Override
        public void run() {
            // TODO Auto-generated method stub
            while(true)
            {
                queqe.get();
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
        }
    
    }
    View Code

    test类

    package com.jiedada.prodacanduse;
    
    public class Test {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Qeuqe q1=new Qeuqe();
            new Thread(new Prodction(q1)).start();
            new Thread(new User(q1)).start();
    
        }
    
    }
    View Code
  • 相关阅读:
    hdu5360 Hiking(水题)
    hdu5348 MZL's endless loop(欧拉回路)
    hdu5351 MZL's Border(规律题,java)
    hdu5347 MZL's chemistry(打表)
    hdu5344 MZL's xor(水题)
    hdu5338 ZZX and Permutations(贪心、线段树)
    hdu 5325 Crazy Bobo (树形dp)
    hdu5323 Solve this interesting problem(爆搜)
    hdu5322 Hope(dp)
    Lightoj1009 Back to Underworld(带权并查集)
  • 原文地址:https://www.cnblogs.com/xiaoruirui/p/10743798.html
Copyright © 2011-2022 走看看