Java多线程基础学习

进程

软件在运行时一种状态。会占用CPU、内存等号资源。

线程

代码的执行路径,是进程的组成部分,一个进程可以有多个线程。每个线程都可以执行自己的内容或者 多个线程共同执行一个任务

线程实例

public class TestThread {
	public static void main(String[] args) {
		//创建线程接口的对象  匿名内部类-实例化,接口,抽象类
		Runnable rb = new Runnable () {
			@Override
			public void run() {
				System.out.println("我是子线程" + Thread.currentThread().getName());
				
				}
			};
			
			//创建线程对象,并定义线程要做的事情
			
			Thread td = new Thread(rb);
			
			//主函数的线程启动
			
			td.run();
			
			System.out.println("主线程:" + Thread.currentThread().getName());
			
	}
}

在这里插入图片描述

线程说明

1.Java中的线程类:Thread
2.Java中的线程都需要接口,线程接口:Runnable
接口内部只有一个方法:run
public void run();
3.每次在写子线程的时候,都需要在run方法内部实现自己要干的事情
4.启动线程是用的start方法

线程的创建方式

1.实现Runnable接口
2.自定义类实现Thread类的子类,重写run方法
3.实现Callable接口

1.实现Runnable接口实现线程
要求:
1.采用匿名内部类 直接完成接口的实例化,并重写run方法
2.自定义类实现接口,重写run方法

public class MyRunnable implements Runnable{

	@Override
	public void run() {
		//子线程实现数羊
		for (int i = 0; i < 101; i++) {
			System.out.println("子线程-数羊" + i + "只羊");
		}
		
	}
	public static void main(String[] args) {
		//1.创建接口的实例化对象
		MyRunnable mr = new MyRunnable();
		
		//2.创建线程对象
		
		Thread td = new Thread(mr);
		
		//主函数启动
		
		td.start();
	}
}

继承Thread类实现线程
创建类继承Thread,并重写run方法

public class HelloThread extends Thread{
	@Override
	public void run() {
		
		System.out.println("继承线程,实现子线程");
	}
	
	public static void main(String[] args) {       
		//1.实例化自定义线程类对象      
		HelloThread ht=new HelloThread();        
		
		//2.启动子线程      
		ht.start();  

	}
}

在这里插入图片描述
使用Callable实现线程
jdk新版本推出线程创建方式,线程可以带返回值。
1.实现Callable接口,并指定线程的返回值类型
2.创建FutureTask对象
3.创新线程对象,并传递任务对象
4.启动线程
5.获取线程的返回

public class MyCallable implements Callable<Integer>{   
 @Override    
 public Integer call() throws Exception {        
 System.err.println("子线程,带返回值的");        
 return new Random().nextInt(10);    } 
 }
    public static void main(String[] args) throws InterruptedException, ExecutionException {       
     //1.创建 Callable接口的实现类对象       
     MyCallable mc=new MyCallable();       
      //2.创建任务对象       
       FutureTask<Integer> ft=new FutureTask<Integer>(mc);       
        //3.创新线程对象        
        Thread td=new Thread(ft);        
        //4.启动线程        
        td.start();       
         //5.获取线程的返回值 只有在线程执行结束之后才会返回        
         System.err.println("返回值:"+ft.get());   
          }

## 线程的状态
线程有五大状态,分别是新建,就绪,运行,阻塞,销毁
新建:
当我们实例化线程对象的时候,线程就是新建状态
就绪:
当我们调用线程的start方法之后,线程就会进入就绪状态
处于该状态的线程,随时都可以获取CPU调度
当线程因为资源竞争,或主动方法调用,让线程进入到阻塞。
常见:sleep、wait、join等等
销毁:
当线程的run方法执行结束之后,就会进入到销毁状态
敲黑板:程序的结束就是指的内部多的所有线程全部进入到了销毁状态
## 线程的分类
线程分为:用户线程和守护线程

```java
  public static void main(String[] args) {       
   // 代码演示线程的类型 用户线程和守护线程       
    //默认的就是用户线程        
    Thread th=new Thread(new Runnable() {                       
     @Override          
       public void run() {                            
       System.err.println("子线程");          
         }       
          });      
        th.start()
 //创建守护线程        
 Thread th2=new Thread(new Runnable() {                   
  @Override                  
    public void run() {                                         
      System.err.println("子线程--守护线程");                    
      }               
       });        
       //设置当前的线程对象是否为守护线程,默认为false        
       th2.setDaemon(true);        
       //启动线程       
        th2.start();    
        }

用户线程和守护线程的区别
皇帝和妃子的故事:
皇帝–>用户线程
妃子们–>守护线程

线程优先级

线程的优先级就是线程获得CPU的概率,优先级越高,获取CPU的概率越大
从小到大,1-10之间。10是优先级高,默认的优先级是5.
设置优先级
通过线程的setPriority 设置线程的优先级
通过线程的getPriority获取线程的优先级
设置优先级需要在start之前设置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值