Java—初学—多线程





并行和并发

并发:指在某一个时间点同时运行多个程序

并行:指在某一个时间内同时运行多个程序


JVM虚拟机的启动时多线程的。

原因垃圾回收线程也要先启动,否则很容易出现内存溢出

现在垃圾回收线程加上前面的主线程,最低启动两个线程。


========================================

需求:我们要实现多线程的程序

如何实现呢?

       由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来。

       而进程是由系统创建的,所以我们应该去掉用系统功能创建一个进程。

       Java时不能直接调用系统功能的,所以我们没办法直接实现多线程程序。

       但是呢?Java可以去调用C/C++写好的程序来实现多线程程序。

       由C/C++去调用系统功能创建进程,然后由Java去调用这样的东西。

       然后提供一些类供我们使用,我们就可以实现多线程程序了

那么Java提供的类是什么呢?

       Thread

       通过查看API,我们知道了两种方式实现多线程程序。

方式1: 

        继承Thread类

        步骤:A:自定义MyThread继承Thread类;

                  B:MyThread类里面重写run();

                          为什么重写呢?

                          因为,不是类中所有的代码都需要多线程执行的。为了区别哪些代码能够被线程执行,java提供了Thread类中                            的run()用来包含那些被线程执行的代码。

                  C:创建对象;

                  D:启动线程;

package cn.itcast_02;

public class ThreadDemo2 {
public static void main(String[] args) {
		
		//调用run()方法为什么是单线程呢?
		//直接调用就相当于普通单线程方法,
		//想看到多线程的效果,必须配合start()
	    
		// //方式一
		// MyThread myth1 = new MyThread();
		// MyThread myth2 = new MyThread();
		// //无参构造+setXxx();
		// myth1.setName("g");
		// myth2.setName("w");
		// myth1.start();
		// myth2.start();
		// //myth.start();
	    
		 MyThread myth1 = new MyThread("g");
		 MyThread myth2 = new MyThread("w");
		 myth1.start();
		 myth2.start();
	
		// //返回当前线程的名称
		// String name = Thread.currentThread().getName();
		// System.out.println(name);
	    
}
}
package cn.itcast_02;
/*
 * 该类重写run()方法,为什么?
 * 
 *     不是类中所有的代码都需要多线程执行的,
 *     为了区别哪些代码能够被线程执行,java提供了Thread类中的run()用来包含那些被线程执行的代码。
 * 
 * Thread类的
 * 得到线程名称:
 *    getName()方法 可以得到线程的名字。
 * 设置线程名称:
 *    setName(String name)方法 可以设置线程名称。
 *    
 *    
 */

import java.security.AccessControlContext;
import java.security.AccessController;

public class MyThread extends Thread {
	
	public MyThread(String name) {
		super(name);
	}
	
    @Override
    public void run() {
    	//自己写执行的代码
    	//System.out.println("好好学习");
    	//一般来说,被线程执行的代码肯定是比较耗时的。
    	for(int x=0;x<100;x++) {
    		System.out.println(getName()+":"+ x);
    	}
    	
    	
    }
}

/*
 * public Thread() {
        private volatile String name;
        init(null, null, "Thread-" + nextThreadNum(), 0);
    }
        private void init(ThreadGroup g, Runnable target, String name,
                      long stackSize) {
        init(g, target, name, stackSize, null, true);
    }
    
    private void init(ThreadGroup g, Runnable target, String name,
                      long stackSize, AccessControlContext acc,
                      boolean inheritThreadLocals) {
        if (name == null) {
            throw new NullPointerException("name cannot be null");
        }

        this.name = name;
    }
        private static int threadInitNumber; 0,1,2
        private static synchronized int nextThreadNum() {
            return threadInitNumber++;0,1
    }
        public final String getName() {
        return name;
    }


*/


run()和start()方法的区别:

run():仅仅是封装了被线程执行的代码,直接调用时普通方法

start():首先启动了线程,然后再由jvm去调用该线程的run()方法

======================================================


注意

线程的默认优先级是5;

优先级范围是0-10;

线程的优先级高表示线程获取的CPU时间片的几率高,但是要再次数比较多,或者多次运行的时候

才能看出效果;

package cn.itcast_03;

public class ThreadPriorityDemo {
     public static void main(String[] args) {
		ThreadPriority tp1 = new ThreadPriority();
		ThreadPriority tp2 = new ThreadPriority();
		ThreadPriority tp3 = new ThreadPriority();
		
		tp1.setName("gao");
		tp2.setName("li");
		tp3.setName("zhang");
		
		//IllegalArgumentException 非法参数异常
		//抛出的异常表明向方法传递了一个不合法的参数
		// 优先级[MAX_PRIORITY,MAX_PRIORITY]=[0,10]
		//NORM_PRIORITY = 5
		tp1.setPriority(10);
		tp2.setPriority(5);
		tp3.setPriority(1);
		
		//
		// System.out.println(tp1.getPriority());
		// System.out.println(tp2.getPriority());
		// System.out.println(tp3.getPriority());
		
		//
		 tp1.start();
		 tp2.start();
		 tp3.start();
	}
}
package cn.itcast_03;

public class ThreadPriority extends Thread {
	@Override
	public void run() {
		for(int x=0;x<1000;x++) {
			System.out.println(getName()+":"+x);
		}
}
}

==========================================

==============================

线程休眠:

package cn.itcast_04;

import java.util.Date;

public class ThreadSleep extends Thread {
	@Override
	public void run() {
		for(int x=0;x<1000;x++) {
			System.out.println(getName()+":"+x+",日期:"+ new Date());
		    // 
			//困了,我稍微休息一秒钟
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		
		}
    
	    
	
	}
}
package cn.itcast_04;

import cn.itcast_04.ThreadSleep;

public class ThreadSleepDemo {
  public static void main(String[] args) {
	  ThreadSleep ts1 = new ThreadSleep();
	  ThreadSleep ts2 = new ThreadSleep();
	  ThreadSleep ts3 = new ThreadSleep();
		
	  ts1.setName("gao");
	  ts2.setName("li");
	  ts3.setName("zhang");
	  
	  ts1.start();
	  ts2.start();
	  ts3.start();

}
}

======================================

线程加入:

==================================

线程礼让:



后台线程:




中断线程:













猜你喜欢

转载自blog.csdn.net/u013116760/article/details/80208835