zoukankan      html  css  js  c++  java
  • java多线程-多线程常识

         线程和进程的区别是什么?进程是一个正在运行的软件程序,打开资源管理器可以看到好多正在运行的进程,而线程则是程序中的顺序控制流,只能使用分配给程序的资源和环境。一个进程至少存在一个线程(主线程)。

         在java中有两种创建线程的方式:继承Thread类和实现Runnable接口。

         线程有以下几种状态,创建状态->就绪状态(start)->运行状态(执行run方法)->阻塞状态(暂时停止执行)->终止状态

       1. 先来看下线程的实现:   

    package com.javaTestDemo;
    
    public class JavaThreadDemo {
    
    	public static void main(String[] args) {
    
    		//1.继承Thread
    //		MyThread t1 = new MyThread("A");
    //		MyThread t2 = new MyThread("B");
    //		
    //		t1.start();
    //		t2.start();
    		
    		//2.实现runnable接口
    		MyRunnable r1 = new MyRunnable("A");
    		MyRunnable r2 = new MyRunnable("B");
    		Thread t1 = new Thread(r1);
    		Thread t2 = new Thread(r2);
    		
    		t1.start();
    		t2.start();
    	}
    
    	
    }
    /**
     *  继承Thread
     * @author newtouch
     *
     */
    class MyThread extends Thread
    {
    	String name;
    	public MyThread(String name)
    	{
    		this.name=name;
    	}
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		super.run();
    		for(int i=0;i<20;i++)
    		{
    			System.out.println("线程"+name+i);
    		}
    	}
    }
    /**
     *   实现runnable接口
     * @author newtouch
     *
     */
    class MyRunnable implements Runnable
    {
    	String name;
    	public MyRunnable(String name)
    	{
    		this.name=name;
    	}
    	@Override
    	public void run() {
    		for(int i=0;i<20;i++)
    		{
    			System.out.println("线程"+name+i);
    		}
    	}
    	
    }
    

      可以看到线程输出AB是并发执行的:

      2.线程的常用方法

          写过自动化测试脚本的同学肯定对这个方法不陌生

          Thread.sleep(); 线程休眠

          还有哪些常用方法呢?

           ①取得线程名称        getName()

           ②取得当前线程对象   currentThread()

           ③判断线程是否启动   isAlive()

           ④线程的强行运行      join()

           ⑤线程礼让              yield()

    来看下join()方法和yield()方法:

    	MyRunnable r1 = new MyRunnable("A");
    //		MyRunnable r2 = new MyRunnable("B");
    		Thread t1 = new Thread(r1);
    //		Thread t2 = new Thread(r2);
    //		
    		t1.start();
    //		t2.start();
    		
    		//join()方法
    		for(int i=0;i<30;i++)
    		{
    			if(i==5)
    			{
    				try {
    					t1.join();
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			}
    			System.out.println("主线程:"+i);
    		}
    

    当主线程执行到i=5的时候,强行让t1线程执行:

    class MyRunnable implements Runnable
    {
    	String name;
    	public MyRunnable(String name)
    	{
    		this.name=name;
    	}
    	@Override
    	public void run() {
    		for(int i=0;i<50;i++)
    		{
    			System.out.println("线程"+name+i);
    			if(i==10)
    			{
    				System.out.println("礼让");
    				Thread.yield();
    			}
    		}
    	}
    	
    }
    

    当i=10的时候,线程礼让查看输出:

    可以看到当两个线程到10的时候都礼让让另一个线程执行

          3.线程的同步

           举个例子,好几个窗口一同往外卖票,虽然都是并发执行的,但是票数是一定的是共有的,票数是随着多个窗口往外卖而同步减少的,这样的话我们就需要线程同步。

           ①同步代码块,在代码块加上 synchronized 关键字,则此代码块就被称为同步代码块

             格式:

             synchronized(同步对象){
                 需要同步的代码;

             }

            ②同步方法 

              synchronized void 方法名称(){}

    同步代码块:

    package com.javaTestDemo;
    
    public class JavaThreadDemo2 {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            MyThreadDemo2 mt = new MyThreadDemo2();
            Thread t1 = new Thread(mt);
            Thread t2 = new Thread(mt);
            Thread t3 = new Thread(mt);
            
            t1.start();
            t2.start();
            t3.start();
        }
    
    }
    class MyThreadDemo2 implements Runnable
    {
    
        private int ticket = 50;
        @Override
        public void run() {
            for(int i=0;i<50;i++)
            {
                synchronized (this) {
                    if(ticket>0)
                    {
                        System.out.println(Thread.currentThread()+"车票:"+ticket--);
                    }
                }
            }
            
        }
        
    }

    可以看到输出:

    也可以同步方法:

    class MyThreadDemo2 implements Runnable
    {
    
        private int ticket = 150;
        @Override
        public void run() {
            for(int i=0;i<150;i++)
            {    
              sell();
            }
        }
        public synchronized void sell(){
            if(ticket>0)
            {
                try {
                    Thread.sleep(500);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread()+"车票:"+ticket--);
            }
        
        }
    }

    查看输出:

         简单记录下线程的入门学习,以后再深入学习理解关于线程的更多知识。

  • 相关阅读:
    oracle 数据库服务名怎么查
    vmware vsphere 6.5
    vSphere虚拟化之ESXi的安装及部署
    ArcMap中无法添加ArcGIS Online底图的诊断方法
    ArcGIS中字段计算器(高级计算VBScript、Python)
    Bad habits : Putting NOLOCK everywhere
    Understanding the Impact of NOLOCK and WITH NOLOCK Table Hints in SQL Server
    with(nolock) or (nolock)
    What is “with (nolock)” in SQL Server?
    Changing SQL Server Collation After Installation
  • 原文地址:https://www.cnblogs.com/dreamyu/p/6528611.html
Copyright © 2011-2022 走看看