java线程的简单实现及方法

java线程:

线程是一个程序内部的顺序控制流。

cpu实际上在一个时间点上,只执行一个。只不过我们把cpu分成了多个时间片,由于速度很快,我们看起来像是多个线程。。

就像你的时间分成几片,这样 整体看来做事情有规律,效率就会高,何况是cpu呢。

线程的创建和启动:



方法一:

java线程通过java.lang.Thread类来实现。

VM启动时会有一个主方法所定义的线程,

每一个线程是Tread对象通过它的run()方法来完成操作。

启动线程方式:Thread的start()方法。



如下代码: 

public class  TestThread

{

public static void main(String[] args)

{

Runner1 r = new Runner1();

//定义线程对象。并且调用线程的构造方法。

Thread t = new Thread(r);

//启动线程。

t.start();

for(int i=0;i<100;i++)

{

System.out.println("Main thread-----" + i);

}

}

}

class Runner1 implements Runnable

{

public void run()

{

for (int i=1;i<100;i++)

{

System.out.println("Runner1" + i);

}

}

}

注意:

重写(override)run()方法在该线程的start()方法被调用后,JVM会自动调用run方法来执行任务;但是重载    (overload)run()方法,该方法和普通的成员方法一样,并不会因调用该线程的start()方法而被JVM自动运行。

方法二:

定义一个Thread类的子类,重写run()方法,然后生成这个类的对象,在启动进程。

如下代码:

public class  TestThread

{

public static void main(String[] args)

{

Runner1 r = new Runner1();

//启动线程。

r.start();

for(int i=0;i<100;i++)

{

System.out.println("Main thread-----" + i);

}

}

}

class Runner1 extends Thread

{

public void run()

{

for (int i=1;i<100;i++)

{

System.out.println("Runner1" + i);

}

}

}


以下是线程的方法及属性:

线程的方法(Method)、属性(Property)

1)优先级(priority)

每个类都有自己的优先级,一般property用1-10的整数表示,默认优先级是5,优先级最高是10;优先级高的线程并不一定比优先级低的线程执行的机会高,只是执行的机率高;默认一个线程的优先级和创建他的线程优先级相同;

2)Thread.sleep()/sleep(long millis)

当前线程睡眠/millis的时间(millis指定睡眠时间是其最小的不执行时间,因为sleep(millis)休眠到达后,无法保证会被JVM立即调度);sleep()是一个静态方法(static method) ,所以他不会停止其他的线程也处于休眠状态;线程sleep()时不会失去拥有的对象锁。作用:保持对象锁,让出CPU,调用目的是不让当前线程独自霸占该进程所获取的CPU资源,以留一定的时间给其他线程执行的机会;

3)Thread.yield()

让出CPU的使用权,给其他线程执行机会、让同等优先权的线程运行(但并不保证当前线程会被JVM再次调度、使该线程重新进入Running状态),如果没有同等优先权的线程,那么yield()方法将不会起作用。

4)thread.join()

使用该方法的线程会在此之间执行完毕后再往下继续执行。

5)object.wait()

当一个线程执行到wait()方法时,他就进入到一个和该对象相关的等待池(Waiting Pool)中,同时失去了对象的机锁—暂时的,wait后还要返还对象锁。当前线程必须拥有当前对象的锁,如果当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常,所以wait()必须在synchronized block中调用。

6)object.notify()/notifyAll()

唤醒在当前对象等待池中等待的第一个线程/所有线程。notify()/notifyAll()也必须拥有相同对象锁,否则也会抛出IllegalMonitorStateException异常。

7)Synchronizing Block

Synchronized Block/方法控制对类成员变量的访问;Java中的每一个对象都有唯一的一个内置的锁,每个Synchronized Block/方法只有持有调用该方法被锁定对象的锁才可以访问,否则所属线程阻塞;机锁具有独占性、一旦被一个Thread持有,其他的Thread就不能再拥有(不能访问其他同步方法),方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。



java线程的简单实现及方法

时间: 2025-01-16 02:14:19

java线程的简单实现及方法的相关文章

JAVA线程超时控制的几种方法

1.设置一个守护线程对执行业务的线程计时,超时则抛出异常 2.Thread类有一个join(long millis)方法,执行该方法时如果另一个线程中断了当前线程,就会抛出一个InterruptedException异常(超时也抛出). 3.java.util.concurrent包FutureTask类有个get(int timeout, TimeUnit timeUnit)方法,该方法会阻塞一直等待执行完成拿到结果,如果在超时时间内没有返回则抛出异常 方法一.二: http://blog.c

linux java线程100%的问题定位方法

一.背景 互联网发展的今天,很多问题都会在生产中遇到,假如某天发现系统资源中cpu占用100%,一直居高不下,那么就要进行问题查询了. 二.解决思路 1.查看那个java进程占用最多,top命令 [[email protected] test]# top -H 2.可以明显看到PID为29003的java进程占用cup最高,已占用了95.5%了,可根据进程号进一步查看该进程的线程情况.显示该进程中每个线程的CPU资源消耗情况. [[email protected] test]# top -H -

java 线程的简单理解

想要实现线程可以继承Thread也可以实现接口runnable,在类中重写 run()方法在主函数调用start方法就可以开辟线程. 对于java对象都有一个wait()和notify().notifyAll()方法这是线程对这个对象资源的使用顺序的调和,在调用这些方法钱必须先使用同步锁synchronized(对象)将方法用在锁的里面就可以了. 一般来说,调用start()方法后run内的内容结束该线程就自动结束了,但是如果里面有线程还在等待某对象则通过人物管理器的详细信息可以看到该进程一直存

Java线程中run和start方法的区别

http://bbs.csdn.net/topics/350206340 Thread类中run()和start()方法的区别如下:run()方法:在本线程内调用该Runnable对象的run()方法,可以重复多次调用:start()方法:启动一个线程,调用该Runnable对象的run()方法,不能多次启动一个线程: package com.ljq.test; public class ThreadTest { /** * 观察直接调用run()和用start()启动一个线程的差别 * * @

Java实现一个简单的缓存方法

缓存是在web开发中经常用到的,将程序经常使用到或调用到的对象存在内存中,或者是耗时较长但又不具有实时性的查询数据放入内存中,在一定程度上可以提高性能和效率.下面我实现了一个简单的缓存,步骤如下. 创建缓存对象EntityCache.java public class EntityCache {   /**    * 保存的数据    */   private Object datas;   /**    * 设置数据失效时间,为0表示永不失效    */   private long time

java 线程池简单例子

package com.hra.riskprice; import com.hra.riskprice.SysEnum.Factor_Type; import com.hra.riskprice.pojo.RskFactor; import com.hra.riskprice.service.impl.RskFactorBulkMapper; import org.springframework.boot.SpringApplication; import org.springframework

java线程sleep(),join()和yield方法

join()方法示例如下: 1 public class Thread1{ 2 public static void main(String[] args) { 3 TestThread t=new TestThread("t"); 4 t.start(); 5 try{ 6 t.join(); //类似于调用run()方法. 7 }catch (InterruptedException e) { 8 9 } 10 for (int i=0;i<=10 ;i++ ) { 11 S

java 线程中 stop()和 suspend()方法为何不推荐使用?

用 synchronized 关键字修饰同步方法: 反对使用 stop(),是因为它不安全.它会解除由线程获取的所有锁定,而 且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它 们.结果很难检查出真正的问题所在: suspend()方法容易发生死锁.调用 suspend()的时候,目标线程会停下来, 但却仍然持有在这之前获得的锁定.此时,其他任何线程都不能访问锁定的资源 , 除非被"挂起"的线程恢复运行.对任何线程来说,如果它们想恢复目标线程, 同时又试图使用任何一个

Java线程的三种命名方法

1.实例化一个线程对象 1 Thread t = new Thread(); 2 t.setName("甲"); 2.实例化一个线程对象的同时,通过构造方法对线程进行命名 1 Thread(Runnable r, String name) 2 Thread t = new Thread(() -> {}, "甲"); 3.使用自定义的线程类,在实例化线程对象的同时,进行名称的赋值 1 MyThread t = new MyThread("甲"