JAVA学习日记-多线程-代码PART1

ThreadTest01.java:

/*
分析以下程序有几个线程?
	
	以下程序只有一个线程,就是主线程.

	main,m1,m2,m3这四个方法在同一个栈空间中。

	没有启动其他任何线程。
*/
public class ThreadTest01 {
	public static void main(String[] args){
		
		m1();
	}
	public static void m1(){
		m2();
	}
	public static void m2(){
		m3();
	}
	public static void m3(){
		System.out.println("m3....");
	}

}

ThreadTest02.java:

/*
在java语言中实现多线程的第一种方式:

	第一步:继承java.lang.Thread;
	第二步:重写run方法.

三个知识点:
	如何定义线程?
	如何创建线程?
	如何启动线程?
*/
public class ThreadTest02 {
	public static void main(String[] args){
		
		//创建线程
		Thread t = new Processor();
		
		//启动
		t.start();//这行代码执行瞬间结束,告诉JVM再分配一个栈内存给t线程
		          //run不需要程序员手动调用,系统线程启动之后自动调用run方法
		
		//t.run();//这是普通方法调用,这样做程序只有一个线程,run方法结束之后,下面的程序才能继续执行。
		
		//这行代码在主线程中运行
		for(int i = 0;i<30;i++){
			System.out.println("main----->"+i);
		}
		//有了多线程之后,main方法结束只是主线程栈中没有方法栈帧了
		//但是其他线程或者其他栈中还有栈帧
		//main方法结束 程序可能仍在运行
		
		
	}

}
//定义一个线程
class Processor extends Thread{
	

	//重写run方法
	public void run(){
		for(int i=0;i<15;i++){
			System.out.println("run---->"+i);
		}
	}
}

ThreadTest03.java:

/*
java中实现线程的第二种方式:
	第一步:写一个类实现java.lang.Runnable;接口
	第二步:实现run方法.
*/
public class ThreadTest03
{
	public static void main(String[] args){
		
		//创建线程
		
		Thread t = new Thread(new Processor1());
		

		//启动
		t.start();
	}
}

//这种方式是推荐的。因为一个类实现接口之外保留了类的继承。
class Processor1 implements Runnable
{
	public void run(){
		for(int i=0;i<10;i++){
			System.out.println("run-->"+i);
		}
	}
}

ThreadTest04.java:

/*
三个方法:
	1.获取当前线程对象Thread.currentThread();
	2.给线程起名 t.setName("t1");
	3.获取线程的名字 t.getName();
*/

public class ThreadTest04 {
	public static void main(String[] args){
		
		//如何获取当前线程对象?
		Thread t = Thread.currentThread();
		
		//获取线程到的名字
		System.out.println(t.getName());
		
		Thread t1 = new Thread(new Processor2());
		
		//给线程起名
		t1.setName("t1");
		
		t1.start();
		
		Thread t2 = new Thread(new Processor2());
		
		t2.setName("t2");
		
		t2.start();
		
	}

}
class Processor2 implements Runnable{
	public void run(){
		Thread t = Thread.currentThread();//t保存的内存地址指向的线程是t1对象
		System.out.println(t.getName());//thread-0 Thread-1
	}
}

ThreadTest05.java:

/*
线程优先级高的获取的CPU时间片相对多一些。

优先级:1-10
最低 1
最高 10
默认 5
*/
public class ThreadTest05 {
	public static void main(String[] args){
		
		System.out.println(Thread.MAX_PRIORITY);//10
		System.out.println(Thread.MIN_PRIORITY);//1
		System.out.println(Thread.NORM_PRIORITY);//5
		
		Thread t1 = new Processor3();
		t1.setName("t1");
		
		Thread t2 = new Processor3();
		t2.setName("t2");
		
		System.out.println(t1.getPriority());//5
		System.out.println(t2.getPriority());//5
		
		//设置优先级
		t1.setPriority(5);
		t2.setPriority(6);
		
		//启动线程
		t1.start();
		t2.start();
		
		
	}

}
class Processor3 extends Thread{
	public void run(){
		for(int i=0;i<50;i++){
			System.out.println(Thread.currentThread().getName()+"---->"+i);
		}
	}
}

ThreadTest06.java:

/*
1.Thread.sleep(毫秒);
2.sleep方法是一个静态方法.
3.该方法的作用:阻塞当前线程.腾出CPU,让给其他线程。
*/
public class ThreadTest06 {
	public static void main(String[] args)throws InterruptedException{
		
		Thread t1 = new Processor4();
	    t1.setName("t1");
	    t1.start();
	    
	    //阻塞主线程
	    for(int i=0;i<10;i++){
	    	System.out.println(Thread.currentThread().getName()+"---->"+i);
	    	
	    	Thread.sleep(500);
	    }
	}

}
class Processor4 extends Thread{
	//Thread中的run方法不抛出异常,所以重写run方法之后,在run方法的声明位置上不能使用throws
    //所以run方法中的异常只能try...catch...
	public void run(){
		for(int i=0;i<10;i++){
			System.out.println(Thread.currentThread().getName()+"-------->"+i);
			try{
				Thread.sleep(1000);//让当前程序阻塞1s
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
		
	}
	
	
	
}

ThreadTest07.java:

//面试题
public class ThreadTest07 {
	public static void main(String[] args)throws Exception{
		//创建线程
		Thread t = new Processor5();
		t.setName("t");
		
		//启动线程
		t.start();
		
		//休眠线程
		t.sleep(5000);//等同于Thread.sleep(5000);阻塞的还是当前线程,和t线程无关
		
		System.out.println("HelloWorld!");
		
		A a = null;
		a.m1();
		
	}

}
class Processor5 extends Thread{
	public void run(){
		for(int i=0;i<200;i++){
			System.out.println(Thread.currentThread().getName()+"--->"+i);
		}
	}
}
class A{
	public static void m1(){
		
	}
}

ThreadTest08.java:

/*
某线程正在休眠,如果打断它的休眠.

以下方式依靠的是异常处理机制。
*/
public class ThreadTest08 {
	public static void main(String[] args)throws Exception{
		//需求:启动线程 5s后打断线程的休眠
		Thread t = new Thread(new Processor6());
		
		//起名
		t.setName("t");
		
		//启动
		t.start();
		
		//5s之后
		t.sleep(5000);
		
		//打断t的休眠
		t.interrupt();
	}

}
class Processor6 implements Runnable{
	public void run(){
		try{
			Thread.sleep(1000000000L);
			System.out.println("HelloWorld!");
		}catch(InterruptedException e){
		//	e.printStackTrace();
		}
		for(int i=0;i<10;i++){
			System.out.println(Thread.currentThread().getName()+"--->"+i);
		}
		
	}
}

ThreadTest09.java:

/*
如何正确的更好的终止一个正在执行的线程.

需求:线程启动5S之后终止。
*/
public class ThreadTest09 {
	public static void main(String[] args)throws Exception{
		Processor7 p = new Processor7();
		Thread t = new Thread(p);
		
		t.setName("t");
		
		t.start();
		
		//5s之后终止
		Thread.sleep(5000);
		
		//终止
		p.run = false;
	}

}
class Processor7 implements Runnable{
	boolean run = true;
	public void run(){
		for(int i=0;i<10;i++){
			if(run){
				try{Thread.sleep(1000);}catch(Exception e){}
				System.out.println(Thread.currentThread().getName()+"--->"+i);
		}else{
			return;
		}
				
	}
}
}

ThreadTest10.java:

/*
Thread.yield();

1.该方法是一个静态方法.

2.作用:给同一个优先级的线程让位。但是让位时间不固定。

3.和sleep方法相同,就是yield时间不固定。
*/
public class ThreadTest10 {
	public static void main(String[] args){
		Thread t = new Processor8();
		
		t.setName("t");
		t.start();
		
		//主线程中
		for(int i=0;i<100;i++){
			System.out.println(Thread.currentThread().getName()+"--->"+i);
		}
	}

}
class Processor8 extends Thread{
	public void run(){
		
		for(int i=0;i<100;i++){
			System.out.println(Thread.currentThread().getName()+"--->"+i);
			if(i%20==0){
				Thread.yield();
			}
		}
	}
	
}
发布了20 篇原创文章 · 获赞 0 · 访问量 264

猜你喜欢

转载自blog.csdn.net/weixin_43150344/article/details/104032947
今日推荐