【Java】线程基础

本文主要介绍线程的基本概念,同时在java中实现多线程操作。


解决问题

均用于回顾时的自我检查。

  • 基础概念
    1.什么是程序/进程/线程?
    2.进程与线程的关系?
    3.线程的生命周期,存在与执行的区别?
    4.程序/进程/线程的储存位置?
    5.Java中实现线程的两种方法?
  • 思考
    1.多个线程同时处理一个对象会出现什么结果?为什么?

基础概念

1.程序
  • 平时我们使用的微信,浏览器等都是程序,
  • 由数据,算法,代码,资源文件等组成。
  • 储存于磁盘
2.进程
  • 程序运行之后就是进程,数目有限。
  • 储存于内存
    进程(打开任务管理器,你就会看到什么是进程了:))
3.线程
  • 进程独立运行的基本组成单位,每个线程负责独立执行一段代码,执行代码后会销毁线程。
  • 从线程创建到执行结束后销毁,我们称之为线程的生命周期
  • 生命周期具体如下:创建,启动,执行,(休眠,等待,暂停),停止。
  • 储存在CPU和高速缓存。(在cpu计算,在高速缓冲储存计算需要数据,在内存存储数据)

注意:同时执行的线程数十分有限,大部分线程创建后会处于等待状态。
线程
相对于线程的执行数,线程的存在数是巨大的。
所以我们使用多个线程提高硬件利用率,提高处理效率。


用Java实现线程

1.Runnable 接口(implements)
  • 需要重写方法:run(){执行代码}
2.Thread类(extends)
  • 需要重写方法:run(){代码};
  • 可调用方法:start();sleep();

注意

  • 1.使用的选择:在一个类可以实现多个接口,而只能继承一个类,所以如果已经基础了类,那就只能去实现借口(runnable)。
  • 2.线程只有通过调用start方法才会启动,其中start方法中调用了run方法,换句话说:实现runnable接口需要强制转换为thread,才能相应地执行任务。

我们这么做:Thread a=(Thread)b;是会报错的;
正确的操作:使用Thread的构造方法

  • ad a=new a();//一个实现runnable的类;
  • Thread b=new Thread(a);//传入实现runnable类的构造方法;
  • b.start();//启动线程,开始执行代码;
3.多线程

多线程就是针对每个线程有各自的执行代码,但是除了提高效率,使用多线程还有什么目的呢?
我们以绘图为例:

  • 单线程画三条线,需要按顺序一条一条画;
  • 多线程每个线程画一条线,三条线就可以同时画出来了;

而复杂运动动画的基本原理就是多线程在object重绘时执行绘制+人眼的视觉暂留效果,这样就会看到许多物体在同时不断运动了。

4.Jvm自动生成线程

  • 每次运行程序至少会存在一个线程,Jvm会生成一个线程去执行main函数里的代码。
  • 按照上文对线程的介绍,当main函数代码执行结束之后Jvm生成的线程会被销毁。

Java线程使用案例

案例一:
我们来回答一个问题:多个线程同时控制一个物体时会产生什么问题?

先修改一下前面的代码,让Thread让同一个变量自加同输出它当前的值。

我们先定义一个类,用于thread构造方法时传入同一个数。

package ThreadAnimation;

public class demo {

   int id=1;

   public demo() {
   	super();
   }
   
   public void print()
   {
   	id++;
   	System.out.println(Thread.currentThread()+"  ->"+id);
   }
}

然后在创建五个线程的时候传入同一个自定义类;

package ThreadAnimation;

import java.util.Random;

public class demoThread extends Thread{

	
	demo d;
	
	    

	public demoThread(demo d) {
		super();
		this.d = d;
	}

	public void run()
	{
		while(d.id<15)
		{
			d.print();
		}
		
	}
	
	public static void main(String[] args)
	{
		System.out.println(Thread.currentThread()+"_:)");
		demo a=new demo();
		for(int i=0;i<5;i++)
		{
			demoThread dt=new demoThread(a);
			dt.start();
		}
	}
}
 	

执行结果如下

案例二结果

嗯…我们发现线程执行的顺序不同,每个线程执行的次数也不是平均相同的,
重要的是,输出的数字是会重复出现的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值