阿里-测试开发面经(七)
点击蓝字关注我们,获取更多面经
多线程通信的方法主要有以下三种:
1.全局变量
进程中的线程间内存共享,这是比较常用的通信方式和交互方式。
注:定义全局变量时最好使用volatile来定义,以防编译器对此变量进行优化。
2.message消息机制
常用的message通信的接口主要有两个:postmessage和postthreadmessage,
postmessage为线程向主窗口发送消息。而postthreadmessage是任意两个线程之间的通信接口。
2.1.postmessage()
函数原型:
b00l postmessage(hwnd hwnd,uint msg,wparam wparam,lparam lparam);
参数:
hwnd:其窗口程序接收消息的窗口的句柄。可取有特定含义的两个值:
hwnd.broadcast:消息被寄送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口
和弹出式窗口。消息不被寄送到子窗口。
null:此函数的操作和调用参数dwthread设置为当前线程的标识符postthreadmessage函数一样。
msg:指定被寄送的消息。
wparam:指定附加的消息特定的信息。
iparam:指定附加的消息特定的信息。
返回值:如果函数调用成功,返回非零值:如果函数调用失败,返回值是零。
ms还提供了sendmessage方法进行消息间通讯,sendmessage(),他和postmessage的区别是:
sendmessage是同步的,而postmessage是异步的。sendmessage必须等发送的消息执行之后,才返回。
2.2.postthreadmessage()
postthreadmessage方法可以将消息发送到指定线程。
函数原型:bool postthreadmessage(dword idthread,uint msg,wparam wparam, lparam lparam);
参数除了threadid之外,基本和postmessage相同。
目标线程通过getmessage()方法来接受消息。
注:使用这个方法时,目标线程必须已经有自己的消息队列。否则会返回error_invalid_thread_id错误。可以用
peekmessage()给线程创建消息队列。
3.cevent对象
cevent为mfc中的一个对象,可以通过对cevent的触发状态进行改变,从而实现线程间的通信和同步。
某个表格存着 s_name subject score 三个字段,比如某一行是 张三 数学 76,现在要选取出所有科目成绩都大于80分的学生名字
select s_name from table_name where s_name not in (select s_name from table_name where score <80)
//新建一个类
public class BinaryNode {
public int value = 0;
public BinaryNode left;
public BinaryNode right;
public BinaryNode(int value) {
this.value = value;
}
}
//生成二叉树方法
public class BinaryTreeUtils {
public static void createBinaryTree(BinaryNode root, int[] array) {
root.value = array.length > 0 ? array[0] : -1;
for (int i = 1; i < array.length; i++) {
insertBinaryTreeNode(root, array[i]);
}
}
private static void insertBinaryTreeNode(BinaryNode root, int value) {
if (root.value >= value) {
if (root.left == null) {
root.left = new BinaryNode(value);
return;
} else {
insertBinaryTreeNode(root.left, value);
}
} else {
if (root.right == null) {
root.right = new BinaryNode(value);
return;
} else {
insertBinaryTreeNode(root.right, value);
}
}
}
}
//深度优先遍历
public static void printBinaryTreeDepthFirst(BinaryNode root)
{
Stack stack = new Stack();
stack.push(root);
while (!stack.isEmpty())
{
root = (BinaryNode) stack.pop();
System.out.print(root.value + " ");
if (root.right != null)
{
stack.push(root.right);
}
if (root.left != null)
{
stack.push(root.left);
}
}
}
第一张表命名为kemu,第二张表命名为score:
kemu表
score表
一、left join
顾名思义,就是“左连接”,表1左连接表2,以左为主,表示以表1为主,关联上表2的数据,查出来的结果显示左边的所有数据,然后右边显示的是和左边有交集部分的数据。如下:
select * from kemu left join score on kemu.id = score.id
结果集:
二、right join
“右连接”,表1右连接表2,以右为主,表示以表2为主,关联查询表1的数据,查出表2所有数据以及表1和表2有交集的数据,如下:
select * from kemu right join score on kemu.id = score.id
结果集:
三、join
join,其实就是“inner join”,为了简写才写成join,两个是表示一个的,内连接,表示以两个表的交集为主,查出来是两个表有交集的部分,其余没有关联就不额外显示出来,这个用的情况也是挺多的,如下
select * from kemu join score on kemu.id = score.id
结果集:
1.GET:一般用于信息获取,使用URL传递参数,对所发送信息的数量也有限制,一般在2000个字符
2.GET:传送的数据量较小,不能大于2KB。post 传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。用IIS过滤器的只接受get参数,所以一般大型搜索引擎都是用get方式
3.GET:是从服务器上获取数据,post 是向服务器传送数据。get 请求返回 request – URI 所指出的任意信息。
4.GET:是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址,用户看不到这个过程。
5.POST:一般用于修改服务器上的资源,对所发送的信息没有限制。
6.GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值,也就是说Get是通过地址栏来传值,而Post是通过提交表单来传值。
更多面经
扫描二维码
获取更多面经
扶摇就业