一、进程和线程的联系及区别。
1.线程是程序执行中的一个执行路径(子任务)。
2.多线程是指程序中包含多条执行路径。也是指在一个进程中的同时执行两个或两个以上的线程。
3.大多数程序只有一条=执行路线,但现实世界中的很多过程都是同时发生的对应这种情况,可编写有多条执行路径的程序,使得程序能够同时执行多个任务(并行)。
4.多线程机制使得程序的多个子任务能够“同时”执行。
5.进程:是一个程序在其自身的地址空间中的一次执行活动,是程序独立运行的基本单位。
二、线程与进程之间的联系。
1.线程在进程之中,单线程即进程。但通常一个进程可拥有多个线程,其中有一个是主线程。
2.线程也有进程的五中状态的转换。
3.线程与进程都是顺序执行的指令系列。
三、线程与进程之间的区别。
1.线程的划分比进程小。
2.进程能独立运行、父进程和子进程都有各自独立的数据空间和代码;线程不能独立运行,父线程和子线程共享相同的数据空间并共享系统资源。
3.进程是相对静止的(但相对于程序是动态的),它代表代码和数据存放的地址空间;而线程是动态的,每个线程代表进程内的一个执行流。
四、java线程的生命周期中一共有五个状态:1.新建状态。2.就绪状态。3.运行状态。4.阻塞状态。5.终止状态。
实例1:
此线程是用继承Thread实现
public class ThreadTest{//使用继承Thread线程
public static void main(String[] agrs){
//new MyThread()新建线程
new MyThread().start();//线程进入就绪状态
}
}
class MyThread extends Thread{
//空构造器
public MyThread(){
}
@Override
public void run(){//线程运行状态
//运行数据
for(int i=0;i<20;i++){
//Thread.currentThread().getName()得到线程名字
System.out.print("子线程:"+Thread.currentThread().getName()+i);
}
}
}
实例2:
此线程是使用Runnable接口实现
public class RunnableTest implements Runnable{
//构造器
public RunnableTest(){
}
public static void main(String[] agrs){
//使用的是匿名新建线程
new Threaad(new RunnableTest()).start();//线程进入就绪状态
}
@Override
public void run(){
for(int i=0; i<20;i++){
System.out.print("子线程:"+Thread.currentThread().getName()+i);//线程运行状态
}
}
}
五、线程停止:
1.定义循环结束标记
因为线程运行代码一般都是循环,只要控制了循环即可。
2.使用interrupt(中断)方法。
该方法是结束线程的冻结状态,使线程回到运行状态中来。
六、线程常用方法。
isAlive() //线程是否还在运行。
getPriority() //获取当前线程优先级。
setPriority() //设置线程优先级(值在10-1之间)。默认为5
sleep() //休眠,指待定线程执行完毕。
yield() //让出CPU.
wait() //是让线程阻塞在着。
notify() //唤醒单个线程。
notify() //唤醒所有的线程。
七、线程同步(synchronized)
格式:
synchronized(对象){
需要同步的代码;
}
实例:(两条线程互相抢对方的而形成死锁)
public class DesdSynTest {
//创建两条线程对象
Object syn1=new Object();
Object Syn2=new Object();
Runnable dst1=new Runnable(){
@Override
public void run(){
try {
test1();
} catch (Exception e) {
e.printStackTrace();
}
}
};
Runnable dst2=new Runnable() {
@Override
public void run() {
try {
test2();
} catch (Exception e) {
e.printStackTrace();
}
}
};
public static void main(String[] args){
new DesdSynTest().start();
}
/**
* start()开线程方法
* */
public void start(){
new Thread(dst1).start();
new Thread(dst2).start();
}
/**
* 在test1中拿着syn1的锁去抢syn2的锁
*
* */
public boolean test1() throws Exception{
synchronized(syn2){
System.out.println(Thread.currentThread().getName()+"test1");
Thread.sleep(1000);
synchronized(syn1){
System.out.println(Thread.currentThread().getName()+"test2");
Thread.sleep(1000);
}
}
return true;
}
/**
* 在test2中拿着syn2的锁去抢syn1的锁
* */
public boolean test2() throws Exception {
synchronized(syn1){
System.out.println(Thread.currentThread().getName()+"test2");
Thread.sleep(1000);
synchronized(syn2){
System.out.println(Thread.currentThread().getName()+"test1");
Thread.sleep(1000);
}
}
return true;
}
}
1.线程是程序执行中的一个执行路径(子任务)。
2.多线程是指程序中包含多条执行路径。也是指在一个进程中的同时执行两个或两个以上的线程。
3.大多数程序只有一条=执行路线,但现实世界中的很多过程都是同时发生的对应这种情况,可编写有多条执行路径的程序,使得程序能够同时执行多个任务(并行)。
4.多线程机制使得程序的多个子任务能够“同时”执行。
5.进程:是一个程序在其自身的地址空间中的一次执行活动,是程序独立运行的基本单位。
二、线程与进程之间的联系。
1.线程在进程之中,单线程即进程。但通常一个进程可拥有多个线程,其中有一个是主线程。
2.线程也有进程的五中状态的转换。
3.线程与进程都是顺序执行的指令系列。
三、线程与进程之间的区别。
1.线程的划分比进程小。
2.进程能独立运行、父进程和子进程都有各自独立的数据空间和代码;线程不能独立运行,父线程和子线程共享相同的数据空间并共享系统资源。
3.进程是相对静止的(但相对于程序是动态的),它代表代码和数据存放的地址空间;而线程是动态的,每个线程代表进程内的一个执行流。
四、java线程的生命周期中一共有五个状态:1.新建状态。2.就绪状态。3.运行状态。4.阻塞状态。5.终止状态。
实例1:
此线程是用继承Thread实现
public class ThreadTest{//使用继承Thread线程
public static void main(String[] agrs){
//new MyThread()新建线程
new MyThread().start();//线程进入就绪状态
}
}
class MyThread extends Thread{
//空构造器
public MyThread(){
}
@Override
public void run(){//线程运行状态
//运行数据
for(int i=0;i<20;i++){
//Thread.currentThread().getName()得到线程名字
System.out.print("子线程:"+Thread.currentThread().getName()+i);
}
}
}
实例2:
此线程是使用Runnable接口实现
public class RunnableTest implements Runnable{
//构造器
public RunnableTest(){
}
public static void main(String[] agrs){
//使用的是匿名新建线程
new Threaad(new RunnableTest()).start();//线程进入就绪状态
}
@Override
public void run(){
for(int i=0; i<20;i++){
System.out.print("子线程:"+Thread.currentThread().getName()+i);//线程运行状态
}
}
}
五、线程停止:
1.定义循环结束标记
因为线程运行代码一般都是循环,只要控制了循环即可。
2.使用interrupt(中断)方法。
该方法是结束线程的冻结状态,使线程回到运行状态中来。
六、线程常用方法。
isAlive() //线程是否还在运行。
getPriority() //获取当前线程优先级。
setPriority() //设置线程优先级(值在10-1之间)。默认为5
sleep() //休眠,指待定线程执行完毕。
yield() //让出CPU.
wait() //是让线程阻塞在着。
notify() //唤醒单个线程。
notify() //唤醒所有的线程。
七、线程同步(synchronized)
格式:
synchronized(对象){
需要同步的代码;
}
实例:(两条线程互相抢对方的而形成死锁)
public class DesdSynTest {
//创建两条线程对象
Object syn1=new Object();
Object Syn2=new Object();
Runnable dst1=new Runnable(){
@Override
public void run(){
try {
test1();
} catch (Exception e) {
e.printStackTrace();
}
}
};
Runnable dst2=new Runnable() {
@Override
public void run() {
try {
test2();
} catch (Exception e) {
e.printStackTrace();
}
}
};
public static void main(String[] args){
new DesdSynTest().start();
}
/**
* start()开线程方法
* */
public void start(){
new Thread(dst1).start();
new Thread(dst2).start();
}
/**
* 在test1中拿着syn1的锁去抢syn2的锁
*
* */
public boolean test1() throws Exception{
synchronized(syn2){
System.out.println(Thread.currentThread().getName()+"test1");
Thread.sleep(1000);
synchronized(syn1){
System.out.println(Thread.currentThread().getName()+"test2");
Thread.sleep(1000);
}
}
return true;
}
/**
* 在test2中拿着syn2的锁去抢syn1的锁
* */
public boolean test2() throws Exception {
synchronized(syn1){
System.out.println(Thread.currentThread().getName()+"test2");
Thread.sleep(1000);
synchronized(syn2){
System.out.println(Thread.currentThread().getName()+"test1");
Thread.sleep(1000);
}
}
return true;
}
}