A
进程
操作系统中运行的一个任务(一个应用程序就运行在一个进程中)。
进程是包含了某些资源的内存区域;操作系统利用进程把它的工作划分为一些功能单元。
线程
进程中包含的一个或者多个执行单元称为线程(thread);线程只归属于一个进程并且它只能访问该进程所拥有的资
源。当操作系统创建一个进程后,该进程会自动申请一个名为主线程或者首要线程的线程。
一个线程是一个进程的顺序执行流,同类的多个线程共享一块空间一组系统资源,线程本身有一个供程序执行的堆
栈,线程在切换时负荷小,因此线程也被称为轻复合进程,一个进程中有多个线程。
线程和进程的区别
一个进程至少要有一个线程。
进程在执行过程中拥有独立的内存资源,而多个线程共享内存。
线程不能独立的执行,必须依存于应用程序中,由应用程序提供多个线程执行控制。
线程使用的场合
线程通常用于子啊一个程序中需要同时完成多个任务的情况。我们可以将每一个任务定义为一个线程。使他们得以一同工作。
创建线程的方法
Thread类是线程类,我们可以听取通过继承类并重写run方法来定义一个具体的线程;启动线程时调用start()方
法;此时就会纳入到线程调用等待获取时间片来开始执行run方法中的阔以逻辑。
并发原理
多个线程“同时”工作指示我们感官上的一种表现。事实上是线程并发运行的;OS将时间划分为很多的时间片段(时间
片),尽可能的均匀给每一个线程,获取时间片的线程被CPU运行,而其他线程处于等待。所以微观上是走走停
停,宏观上是都在运行;这种现象叫做并发,但不是绝对意义上的同时发生。
使用Runnable创建并启动线程
实现Runnable接口并重写run方法来定义线程体,然后再创建线程的时候将Runnble的实例传入并启动线程。
实现Runnable接口创建线程这样的好处在于可以将线程与线程要执行的任务分开减少耦合;同时java是单继承的,定
义一个类实现Runnable接口这样的做法可以更好的去实现其他父类或者接口,因为接口是多实现(多继承)的关
系。
线程常用API
//获取线程ID
long id=th.getId();
System.out.println(id);
//获取线程名称
String name=th.getName();
System.out.println(name);
th.setPriority(2);//设置线程优先级
int a=th.getPriority();//获取线程优先级,默认为5
System.out.println(a);
线程优先级
线程的切换是线程调度控制的,我们无法通过代码来干涉,但我们可以通过提高线程的优先级来最大程度的改善
线程获取时间片的几率。
线程的优先级被划分为10级,值分别是1-10,其中1最低,10最高。线程提供3个常量来表示最低、最高以及默认
优先级:
---Thread.MIN_PRIORITY,
---Thread.MAX_PRIORITY,
---Thread.NORM_PRIORITY,
Thread.sleep();静态方法,该方法会使当前线程进入阻塞状态指定毫秒,当阻塞指定毫秒后,当前线程就会进入到
Runnable状态,等待分配时间片。
static void yield():该方法用于使用当前线程主动让出CPU时间片回到Runnable状态,等待分配时间片。
void join():该方法用于等待当前线程结束。该方法声明InterruptException。
守护线程
与普通线程在表现上没有区别;唯一不同点:当进程中只剩下守护线程时,所有的守护线程都
会强制终止。
---守护线程的床创建:void setDeamon(boolean b);GC就是运行在一个守护线程上。
线程同步
多个线程并发读写同一个临界资源时会发生“线程并发安全问题”。
常见的临界资源:
--多线程共享实例变量;
--多线程共享静态公共变量。
若想解决线程安全问题,需要将异步操作变成同步操作。
--异步操作:多线程并发的操作,相当于各干各的。
--同步操作:有先后顺序的操作,相当于你干完后我在再干。
synchronized关键字是java中的同步锁
通信
Socket:通常称为套接字,用于描述IP和端口,是一个通信链的句柄;在Internet上的主机
一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个socket,并绑定在一
个端口上,不同的端口对应不同的服务。
应用程序通常通过“套接字”向网络发出请求或者应答网络请求。Socket和ServerSocket位于
java.net包中。ServerSocket用于服务器,Socket是建立网络连接是使用的,在连接成功
时应用程序两端都会有一个Socket实例。操作这个实例就会完成所需的会话。
获取本地地址和端口号
--int getLocalPort();获取本地的端口号
--InetAddress getLocalAddress():用于获取Socket绑定的本地地址。
--使用InetAddress获取本地地址的方法:String getCanonicalHostName();
--String getHostAddress():返回IP地址字符串(以文本形式表现)
获取远端地址和端口号
--int getPort();获取远端使用的端口号
--InetAddress getInetAddress();获取套接字(Socket)绑定的远端地址
获取网络输入流和网络输出流
--通过Socket获取网络输入和输出流的方法如下:
InputStream getInputStream():返回此套接字的输入流;
OutputStream getOutputStream():用于获取此套接字的输出流。